2016-03-07 16 views
10

Recentemente ho avuto un bug in un contesto simile a quello successivo:segnali di avvertimento gcc per le conversioni implicite

double getSomeValue() 
{ 
    return 4.0; 
} 
... 
std::string str; 
str = getSomeValue(); 

Come si può vedere qui è facile da individuare il problema, ma in una grande base di codice in cui getSomeValue() è non nello stesso file con il codice chiamante potrebbe essere difficile individuare questa conversione da double a std::string. GCC compila questo codice con -Wall -Wextra -Werror (output di esempio qui, non so quali flag di avviso sono stati utilizzati: http://ideone.com/BTXBFk).

Come posso forzare GCC a emettere avvisi per queste conversioni implicite pericolose? Ho provato -Wconversion, ma è molto severo e causa errori nella maggior parte delle intestazioni incluse per casi comuni come unsigned - 1. C'è una versione più debole di -Wconversion?

+0

In realtà è 'double' →' 'char' → conversione STRING'. Il primo può essere catturato da '-Wfloat-conversion', che è anche abilitato da' -Wconversion' –

+0

@Revolver_Ocelot Grazie, questa bandiera sembra essere quella che sto cercando. Sfortunatamente non è disponibile in GCC 4.8.2 – Felics

+0

@ DieterLücking Ho specificato nella domanda che non posso usare -Wconversion perché ottengo molti errori per i costrutti senza segno - 1 come in molti header inclusi. – Felics

risposta

5

È possibile utilizzare il flag -Wfloat-conversion o il più ampio -Wconversion.

Si noti tuttavia che con C++ 11 inizializzazione uniforme brace sintassi, si ottiene un avvertimento "out of the box", senza la bandiera -Wconversion; es .:

#include <string> 

double getSomeValue() { 
    return 4.0; 
} 

int main() { 
    std::string str{ getSomeValue() }; // C++11 brace-init 
} 
C:\Temp\CppTests>g++ -std=c++11 test.cpp 
test.cpp: In function 'int main()': 
test.cpp:8:35: warning: narrowing conversion of 'getSomeValue()' from 'double' t 
o 'char' inside { } [-Wnarrowing] 
    std::string str{ getSomeValue() }; 
           ^
+0

Questo non aiuta con 'str = getSomeValue();', che è un'assegnazione piuttosto che inizializzazione (Presumibilmente ci sono casi nel codice OP dove l'assegnazione arriva qualche tempo dopo che la variabile è già in uso, quindi non può essere sostituita con l'inizializzazione) –

+0

@MM: Probabilmente in quei casi qualcosa del genere potrebbe funzionare per l'OP: 'str = std :: string {getSomeValue()};'. Ad ogni modo, considero l'uso di '-Wconversion' una buona opzione. –

Problemi correlati