Вы не инициализируете m_name
, поэтому он указывает куда угодно, поэтому вы пишете наугад и вылетаете.
Вам необходимо выделить и вернуть пробел или передать пробел (вместе сдлина пробела), гарантируя, что вы не будете перезаписывать в каждом случае.
Обратите внимание, что символы пробела в имени макроса являются ошибкой в определении макроса.Там может быть ведущий пробел;там может быть пробел;но не может быть пробела в середине имени.Теперь, если вы предполагаете, что вам дали действительный Makefile
для анализа, вы можете избежать игнорирования этой тонкости.Если вы пишете замену для make
, вы не можете.
Если вы ранее не подтвердили наличие знака равенства в строке, вам также следует убедиться, что вы не убежаликонец строки (вы не сканируете за NUL '\0'
).На самом деле, в надежном коде вы, вероятно, гарантируете это из паранойи.
while (line[i] != '\0' && line[i] != '=')
{
...
}
И во время написания этого я понял, что вы увеличиваете i
в состоянии while
, а затем проверяетеявляется ли следующий символ пробелом в теле цикла.Это немного условно, скажем так.Если вы встретите макрос:
MACRO=value
, вы скопируете =
в m_name
, когда условие цикла проверяет O
.И, AFAICS, вы не будете копировать M
.
Обратите внимание, что ваша строка:
m_name[name_pos] = '\0';
находится вне какой-либо функции и, следовательно, синтаксическая ошибка.