4

Socket operation on non-socket呼び出し時にネットワーク コードの一部でエラーに遭遇し、その原因をconnect突き止めるために多くの時間を費やしました。最終的に、次のコード行が問題の原因であることがわかりました。

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol) < 0)) {

問題が見えますか?行は次のようになります。

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {

私が理解できないのは、最初の間違った行が警告を生成しない理由です。別の言い方をすれば、一般的な形式ではありません。

if ( foo = bar() < baz ) do_something();

特にg++ -Wall -Wextra? で実行すると、コンパイラにとって奇妙に見えます。

そうでない場合、少なくともコンパイルの一部として実行している cppcheck に「悪いスタイル」として表示されるべきではありませんか?

4

2 に答える 2

5

実際には、二重括弧があるため、警告は表示されません(

1 つのペアを削除しようとすると、警告が返されます。

#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;
}

このような迷惑な間違いやタイプミスを避けるために、値を割り当てて同じステートメントでテストすることは避けています。それはあまりにもエラーが発生しやすい私見です。

于 2010-06-17T09:18:14.160 に答える
2

これが、私が 1 つのステートメントであまり多くのことを行わないようにしている理由の 1 つです。それ以外の

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {

なぜだめですか:

sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)
if(sockfd < 0) {
于 2010-06-17T09:19:11.413 に答える