Was bedeutet „Kontrolle erreicht Ende der Nicht-Nichtigkeitsfunktion“?
Lesezeit: 4 Minuten
teknolagi
Ich habe seltsame Compiler-Fehler bei diesem binären Suchalgorithmus erhalten. Da bekomme ich eine Warnung control reaches end of non-void function. Was bedeutet das?
int binary(int val, int sorted[], int low, int high) {
int mid = (low+high)/2;
if(high < low)
return -1;
if(val < sorted[mid])
return binary(val, sorted, low, mid-1);
else if(val > sorted[mid])
return binary(val, sorted, mid+1, high);
else if(val == sorted[mid])
return mid;
}
Der Compiler kann diesem Code nicht entnehmen, ob die Funktion jemals das Ende erreicht und immer noch etwas zurückgibt. Um das zu verdeutlichen, ersetzen Sie den letzten else if(...) nur mit else.
(Und der Compiler hat Angst, weil eine Funktion, die so eingegeben wurde, dass sie eine zurückgibt int muss eigentlich an zurückgeben intund fallen nicht einfach vom Ende der Funktion ab)
– marnir
30. Mai 2011 um 1:18 Uhr
Danke! Das macht Sinn! wird das nicht etwas Unerwünschtes einfangen?
– teknolagi
30. Mai 2011 um 1:18 Uhr
@teknolagi, naja, die Logik für uns Menschen ist ganz klar: val kann nur sein <, >oder == zu sorted[mid]es gibt wirklich keine Alternative … Also kann es nichts anderes fangen, wenn das die ganze Logik ist.
– loswerden
30. Mai 2011 um 1:21 Uhr
Eine andere Möglichkeit, die Warnung loszuwerden, ist das Hinzufügen assert(false); am Ende der Funktion, um dem Compiler (und dem menschlichen Leser) klar zu sagen, dass Sie absichtlich weggelassen haben anders Fall, weil Sie sicher sind, dass es nicht passieren kann.
– dpi
8. Juli 2018 um 17:34 Uhr
Der Compiler ist nicht intelligent genug, um das zu wissen <, >und == sind ein “komplettes Set”. Sie können es wissen lassen, indem Sie die Bedingung “if(val == sorted[mid])” — es ist überflüssig. Sagen Sie einfach “else return mid;“
Der Compiler ist schlau genug. Das Problem ist, dass der Benutzer nicht schlau genug war, eine Optimierungsstufe ungleich Null anzugeben. -O0 ist fast immer eine sehr sehr schlechte Idee.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
30. Mai 2011 um 2:24 Uhr
Interessante Idee, aber ich glaube nicht. Zum Beispiel, gcc gibt diesen Fehler mit -O3 .
– Ernest Friedman Hill
30. Mai 2011 um 2:44 Uhr
Allerdings habe ich mit gcc 4.5.2 bestätigt.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
30. Mai 2011 um 3:02 Uhr
Außerdem habe ich das Hinzufügen von a getestet printf call am Ende der Funktion, und gcc generiert tatsächlich Code dafür. Irgendwie wird dieser Punkt also nicht als unerreichbar erkannt …
– R.. GitHub HÖR AUF, EIS ZU HELFEN
30. Mai 2011 um 3:04 Uhr
Wenn die Funktion nicht ungültig ist, bedeutet dies, dass sie etwas zurückgeben muss, bevor sie das Ende des Funktionsblocks erreicht[ _} ]Wenn wir also nur if- und else-if-Anweisungen angeben, kann der Compiler diesem Code nicht entnehmen, dass irgendeine dieser Anweisungen als wahr ausgewertet wird und etwas zurückgibt. Das heißt, wenn alle Bedingungen als falsch ausgewertet werden, wird die Steuerung dies tun Erreichen Sie das Ende der Funktion, ohne etwas zurückzugeben, was falsch ist.
Erstellen Sie immer mit mindestens minimaler Optimierung. Mit -O0, wurden alle Analysen, die der Compiler verwenden könnte, um festzustellen, dass die Ausführung das Ende der Funktion nicht erreichen kann, deaktiviert. Aus diesem Grund sehen Sie die Warnung. Die einzige Zeit, die Sie jemals nutzen sollten -O0 ist für das schrittweise Debuggen, was normalerweise sowieso kein guter Debugging-Ansatz ist, aber es ist das, was die meisten Leute, die mit MSVC angefangen haben, gelernt haben …
Ich hatte das gleiche Problem. Mein Code unten hat nicht funktioniert, aber als ich das letzte “if” durch “else” ersetzt habe, funktioniert es. Der Fehler war: kann das Ende der nicht ungültigen Funktion erreichen.