2016-02-08 2 views
0

Мне нужно использовать инструменты для легкого инструментария (скажем, с использованием существующей инфраструктуры предварительного процессора Python или, возможно, C), чтобы систематически вставлять утверждения в if-условиях C функции:Ищете легкое решение для систематического определения if-условий функций C

Например, пусть Foo функция, C:

int foo(int x){ 
    if (x>3) 
     return x; 
} 

мне нужно, чтобы превратить его в

int foo(int x){ 
    if (x>3){ 
     print ("%d", x); 
     return x; 
    } 
} 

I га ve попытался использовать LLVM, но он не интегрируется лучше с другими частями кода. Здесь я бы предпочел рамочное решение для препроцессора Python/C. Спасибо за ваши идеи.

+0

'void' функция не может возвращать значение. И даже если это был тип 'int', не все ваши пути возвращают значение. –

+1

Что вы пробовали? И точно, насколько автоматическим вы хотите, чтобы это было - вы готовы вручную добавить что-либо к этим операторам 'if'? – Dmitri

+3

В вашем примере код, который нужно вставить, кажется довольно специфичным для контекста, в который вы хотите вставить его. Как вы представляете, что это достигается автоматизированным инструментом? –

ответ

1

Вы можете использовать GCC MELT или, возможно, GCC Python Plugin, чтобы настроить компилятор GCC, чтобы преобразовать его представление Gimple. Это было бы полным решением, но я не уверен, что он квалифицируется как «легкий» (потому что вам нужно понять детали внутренних компонентов GCC), но ни один из них не является подходом Clang/LLVM. Вы, вероятно, нужно больше, чем на неделю работы (в частности, чтобы узнать о внутренностях GCC, или Clang/LLVM)

BTW, ваша проблема менее легко, чем то, что вы верите, так как

int foobar(int x) { return (x>3)?(x*6):(x*x); } 

содержит условное обозначение. Кроме того, исходная функция точно эквивалентно

int foo(int x){ 
    while (x>3) // this while is done 0 or 1 time 
     return x; 
} 

и легко найти много других способов выразить это.

Таким образом, чисто синтаксический подход никогда не будет работать полностью. Следовательно, вы не можете надеяться на что-то «светлое».

(мое мнение в том, что код C инструментовка никогда легкая проблема)

+0

Действительно, она выглядит тяжелее, чем llvm. Спасибо, в любом случае. – zell

+0

Не тяжелее, а просто другой. В любом случае вам нужно погрузиться в состав компилятора. Дело в том, что выражение 'if' не означает многого (вы можете иметь условное выражение в других формах) –

 Смежные вопросы

  • Нет связанных вопросов^_^