2015-11-24 39 views
5

Pracuję nad projektem wielowątkowym, który ucierpiał z powodu wielu błędów spowodowanych używaniem funkcji bibliotecznej "strtok()", która nie jest bezpieczna dla wątków.GCC lub zaznacz flagę, aby zabronić określonej funkcji standardowej biblioteki

Chciałbym znaleźć sposób na zabronienie używania tej funkcji (i być może innych) poprzez zdefiniowanie czegoś w pliku projektu (Qt Creator/qmake) (np. Przedefiniowanie symbolu), aby utrzymać nowych programistów lub wytrawnych twórców błędów od wprowadzenia go ponownie.

Wszelkie pomysły?

+1

Dobrze jest [gcc trucizna] (https://gcc.gnu.org/onlinedocs/gcc-3.3 /cpp/Pragmas.html) –

+0

Ponieważ i tak trzeba go zastąpić, dlaczego nie przeszukać wszystkich plików pod kątem jego użycia? – Olaf

+1

@Olaf wyszukiwanie i ustalanie bieżących zastosowań nie pomaga, gdy ktoś później dodaje kod, który wywołuje strtok. OP może stworzyć własny strtok, który spowoduje przerwanie jeśli zostanie wywołany - nowo dodane wywołania do strtok zostaną znalezione podczas testowania twojego urządzenia. – FredK

Odpowiedz

1

to jest to, co mówi instrukcja GCC o eliminacji stosowania niektórych funkcji bibliotecznych:

#pragma GCC poison 
Sometimes, there is an identifier that you want to remove completely 
from your program, and make sure that it never creeps back in. 
To enforce this, you can poison the identifier with this pragma. 
#pragma GCC poison is followed by a list of identifiers to poison. 
If any of those identifiers appears anywhere in the source after the directive, 
it is a hard error. For example, 

      #pragma GCC poison printf sprintf fprintf 
      sprintf(some_string, "hello"); 


will produce an error. 

If a poisoned identifier appears 
as part of the expansion of a macro which was defined 
before the identifier was poisoned, it will not cause an error. 
This lets you poison an identifier 
without worrying about system headers defining macros that use it. 

For example, 

      #define strrchr rindex 
      #pragma GCC poison rindex 
      strrchr(some_string, 'h'); 


will not produce an error. 
+0

. Największym problemem związanym z wykorzystaniem tej pragmy jest informowanie, że jest ona zawarta w każdym pliku źródłowym po instrukcjach #include. – user3629249

+0

Z tego powodu nie przedstawiłem mojego komentarza i odpowiedzi, ponieważ nie jest on idealny, a PO nie powiedział, że było to dopuszczalne rozwiązanie. Chociaż myślę, że to najlepsze, co otrzymam PO. –