„Socket Betrieb auf nicht-Buchse“ Fehler aufgrund seltsame Syntax
Frage
Ich lief über den Fehler Socket operation on non-socket
in einigen meiner Netzwerk-Code, wenn connect
Aufruf und viel Zeit damit verbracht, um herauszufinden, was es verursacht wurde. Ich endlich herausgefunden, dass die folgende Zeile Code wurde das Problem verursacht:
if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol) < 0)) {
Sehen Sie das Problem? Hier ist, was die Linie sollte wie folgt aussehen:
if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {
Was ich nicht verstehe, ist, warum die erste, falsche Linie erzeugt keine Warnung. Um es anders auszudrücken, sollte nicht die allgemeine Form:
if ( foo = bar() < baz ) do_something();
seltsam aussehen an den Compiler, vor allem mit g++ -Wall -Wextra
läuft?
Wenn nicht, sollte es nicht zumindest zeigen sich als „schlechter Stil“ zu cppcheck, die ich auch als Teil meiner Kompilierung renne?
Lösung
Eigentlich Sie erhalten keine Warnung wegen der doppelten Klammer (
.
Versuchen Sie, ein Paar zu entfernen, und Sie werden die Warnung zurück.
#include <iostream>
int foo()
{
return 2;
}
int main(int /*argc*/, char** /*argv*/)
{
int l;
if ((l = foo() < 3)) // Won't generate warning under gcc
{
}
if (l = foo() < 3) // will generate a warning "warning: suggest parentheses around assignment used as truth value"
{
}
return EXIT_SUCCESS;
}
Um diese lästigen Fehler / Tippfehler zu vermeiden, vermeide ich einen Wert zuweisen und sie in der gleichen Aussage zu testen. Das ist zu viel fehleranfällig imho.
Andere Tipps
Das ist ein Grund, warum ich versuche, nicht zu viel in einer Erklärung zu tun. Statt
if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {
Warum nicht:
sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)
if(sockfd < 0) {