2015-08-07 2 views
1

Я хочу изменить свой код, используя Coccinelle скрипт:вопросы Pointer в Coccinelle

// Before modification 

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int i; 
    int *p; 

    *p=i; 

    return 0; 
} 

Ожидаемый результат:

// After modification 

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int i; 
    int *p; 

    if (p!=NULL) 
     *p=i; 

    return 0; 
} 

Мой Coccinelle сценарий выглядит следующим образом:

@[email protected] 
type T; 
T* ptr; 
expression E; 
@@ 

-*ptr= E; 
+ if (ptr!=NULL) 
+ptr=E; 

Мой сценарий неверен, потому что оператор «звезда» используется Coccinelle. Может ли кто-нибудь помочь мне узнать, для чего полезен оператор «звезда», потому что я немного смущен этим оператором. Как я могу изменить свой скрипт, чтобы получить ожидаемый результат?

+0

Код C, который вы представили, является лишь примером? Поскольку вы читаете неинициализированные переменные. – this

+0

Ваш пример: программа C сбой (если вам повезет). Вы пытаетесь записать в нераспределенную память. –

+0

@ FilipeGonçalves: И измененная версия читает неинициализированную переменную. – EOF

ответ

2

Поместите пробел перед *.

Coccinelle использует *, чтобы указать, что совпадение требуется, а не преобразование. * Указывает строку, которая должна быть подсвечена в результате.

0

Я полагаю, что оператор * используется cocinelle для соответствия шаблону, x* будет соответствовать нескольким вхождению x в строку.

Я бы попробовал избежать * с обратной косой чертой \*.

+0

В сценарии Coccinelle выше i escaped * с обратным слэшем \ *, но я получил ошибку: Fatal error: exception Lexer_cocci.Lexical ("unrecognized символ, в правиле маркера: \ ") – fedi

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

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