Почему неявное объявление free принимается параметром vararg в llvm - PullRequest
1 голос
/ 26 апреля 2019

Взял следующий код

int main() {
  int* a = (int*) malloc(sizeof(int) * 10);
  free(a);
  return 0;
}

Если скомпилировать его в llvm IR clang -S -emit-llvm -O0 -g, объявление free будет:

declare i32 @free(...) #2

Однако, если я добавлю #include <stdlib.h>, объявление free будет:

declare void @free(i8*) #2

При добавлении include объявление явно берется из заголовочного файла, но почему неявное объявление free отличается?

1 Ответ

2 голосов
/ 26 апреля 2019

В C (когда это разрешено действующим стандартом C) подразумеваемый тип функции foo, которая вызывается без предварительного прототип или определение - int foo(), что в C означает функцию, принимающую неуказанные аргументы и возвращающую int . Неявное объявление функций недопустимо с C99 и всегда недопустимо в C ++.

Если вы скомпилировали именно этот код именно с теми параметрами, которые вы видели предупреждения для неявных объявлений malloc и free, хотя они не проясняйте, что подразумевается под типами. Если бы вы скомпилировали с помощью clang ++ вместо clang, вы бы увидели две ошибки .

...