Как я могу указать целевую платформу при использовании libclang для анализа кода C? - PullRequest
0 голосов
/ 03 апреля 2019

Я использую инструмент анализа исходного кода с использованием Clang (версия 6.0.1).Исходный код, который я хочу проанализировать, был написан для процессора ARM и будет скомпилирован с использованием arm-none-eabi-gcc.Мой инструмент работает на Linux или Windows.Как я могу сказать libclang анализировать этот код для целевой платформы, а не для платформы хоста?

При вызове clang_indexSourceFile (...) для анализа исходного кода я даю ему те же опции -D и -Iчто я использую для arm-none-eabi-gcc, включая опции, которые неявно добавляются в arm-none-eabi-gcc.Их можно получить, выполнив следующую команду:

arm-none-eabi-gcc -v -dM -E - </dev/null

Я также передаю эти флаги ARM_specific как arm-none-eabi-gcc и clang_indexSourceFile (...): -mcpu = cortex-m4 -mthumb -mfpu = fpv4-sp-d16 -mfloat-abi = hard

Тем не менее, libclang использует встроенные размеры шрифтов, соответствующие платформе хоста (Linux или Windows) вместо целевой платформы (Arm).Один из способов проверить это с помощью следующего, по общему мнению, несколько надуманного кода:

int c = 1;
switch (c) {
    case sizeof(long double): return 1;
    case 16: return 2;
    default: return 0;
}

Когда я анализирую этот код с помощью libclang, я получаю диагностическое «Duplicate case value '16'», доказывающее, что оно предполагает, что longdouble - 16 байтов.С arm-none-eabi-gcc я не получаю эту ошибку (но я получаю похожую ошибку при замене 16 на 8).

1 Ответ

0 голосов
/ 08 апреля 2019

Используйте -target arm-none-eabi в качестве опции при вызове clang_indexSourceFile (...). Спасибо Ивану Косареву за предложение этого решения.

...