clang BlocksRuntime встраивает предупреждение об устаревшем компиляторе в исполняемый файл при использовании __block - PullRequest
2 голосов
/ 07 августа 2020
#include <stdio.h>
#include <Block.h>
int main()
{
  __block int x = 5;
  ^{printf("x is %i\n", x);}();
}

Когда я использую clang для компиляции программы c (или c ++), которая использует как блоки clang, так и спецификатор типа __block, никаких предупреждений компилятора не выдается, даже при использовании -Wall и -Wpedanti c. Программа также работает должным образом. Однако, если я открываю исполняемый файл с помощью текстового редактора, я нахожу этот блок текста (извлеченный с помощью команды 'strings'):

Block_release called upon a stack Block: %p, ignored
_Block_byref_release: Block byref data structure at %p underflowed
Block compiled by obsolete compiler, please recompile source for this Block
descriptor->dispose helper: %p
byref data block %p contents:
^%p (new layout) =
isa?: %p
refcount: %u
invoke: %p
descriptor: %p
descriptor->reserved: %lu
descriptor->size: %lu
descriptor->copy helper: %p
  forwarding: %p
  flags: 0x%x
  size: %d
  copy helper: %p
  dispose helper: %p
NULL passed to _isa: stack Blockisa: malloc heapisa: GC heap Bloisa: global Blocisa: finalizing 

Проблема в том, что я использую последнюю версию clang - вряд ли "устаревший" компилятор. Я нахожусь на Linux (musl), и я установил BlocksRuntime из https://github.com/mackyle/blocksruntime. Я также нашел здесь фрагмент кода, который генерирует предупреждение - https://github.com/mackyle/blocksruntime/blob/master/BlocksRuntime/runtime.c#L629

λ: clang --version
clang version 10.0.0 
Target: x86_64-unknown-linux-musl
Thread model: posix
InstalledDir: /bin
λ: uname -a
Linux thinkpad 5.7.9_1 #1 SMP Thu Jul 16 10:02:50 UTC 2020 x86_64 GNU/Linux

Можно ли игнорировать это предупреждение? Если нет, что мне делать?

1 Ответ

0 голосов
/ 07 августа 2020

Я только что понял, что предупреждение, вероятно, означает ошибку времени выполнения, хранящуюся в виде строки в исполняемом файле, что означает, что проблемы нет. Дизассемблирование, похоже, поддерживает эту идею - radare2 показывает строку в разделе .rodata: Снимок экрана radare2, показывающий строку 'устаревшего компилятора' в разделе .rodata

Надо было подумать об этом раньше ...

...