C and C++ Binaries


IO.SOCK.STATE : 不適切な状態でのソケット操作

要旨

ソケット操作が、その操作に対して適切ではない状態で実行されています。

プロパティ

クラス名 Socket In Wrong State
日本語クラス名 不適切な状態でのソケット操作
クラス分類 信頼性 (reliability)
ニーモニック IO.SOCK.STATE
カテゴリー
MisraC2023 MisraC2023:D.4.13 Functions which are designed to provide operations on a resource should be called in an appropriate sequence
Misra2012 Misra2012:D.4.13 Functions which are designed to provide operations on a resource should be called in an appropriate sequence
CWE CWE:666 Operation on Resource in Wrong Phase of Lifetime
  CWE:696 Incorrect Behavior Order
対応言語 C および C++ で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっています。チェックを有効にするにはプロジェクト設定ファイル (configuration file)に以下の WARNING_FILTER ルールを追加してください。
WARNING_FILTER += allow class="Socket In Wrong State"

#include <sys/socket.h>
#include <unistd.h>

int listen_no_bind(){
    int sock = socket(PF_LOCAL, SOCK_STREAM, 0);
    struct sockaddr a;
    socklen_t alen = sizeof(struct sockaddr);
    int res;

    if (sock < 0 ) return -1;
    res = listen(sock, SOMAXCONN); /* 'Socket In Wrong State' warning issued here
                                    * - socket has not been bound
                                    */
    close(sock);
    return res;
}


int listen_after_bind(){
    int sock = socket(PF_LOCAL, SOCK_STREAM, 0);
    struct sockaddr a;
    socklen_t alen = sizeof(struct sockaddr);
    int res;

    if (sock < 0 ) return -1;
    res = bind(sock, &a, alen);
    if (res >= 0){
      res = listen(sock, SOMAXCONN);               /* ok: socket has been bound with bind() */
    }
    close(sock);
    return res;
}

ワーニングを引き起こす関数

ワーニングを引き起こす関数 ワーニングが引き起こされる時
int accept(int s, struct sockaddr *addr, socklen_t *addrlen) ソケットが listen() により listen 状態となっていない場合
int bind(int sockfd, void *my_addr, int addrlen); ソケットの sockfdsocket() によって初期化されていない場合
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen) ソケットの sockfd が既に (listen() 呼び出しにより) listen 状態となっている場合
int listen(int sockfd, int backlog); ソケット sockfdbind() により bind 状態となっていない場合
int recv(int sockfd, void *buf, size_t len, int flags) ソケット sockfdconnect() により connect 状態となっていない場合
int send(int s, const void *msg, size_t len, int flags) ソケット sockfdconnect() により connect 状態となっていない場合

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。