naver / arcus-memcached

ARCUS memory cache server
https://github.com/naver/arcus
Apache License 2.0
70 stars 55 forks source link

INTERNAL: Fix a clang static analyzer issue about getpeername failure #767

Closed ing-eoking closed 3 months ago

ing-eoking commented 4 months ago

๐Ÿ”— Related Issue

โŒจ๏ธ What I did

jhpark816 commented 4 months ago

์•„๋ž˜์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌํ–ˆ์œผ๋‚˜ ์—ฌ์ „ํžˆ warning์ด ๋ฐœ์ƒํ•˜์—ฌ memset์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

if (getpeername(c->sfd, (struct sockaddr*)&addr, &addrlen) != 0) {
/* Fail Handler */
} else {
snprintf(c->client_ip, 16, "%s", inet_ntoa(addr.sin_addr));
}

์–ด๋–ค warning ์ธ์ง€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ์„ธ์š”. ์™„์ „ํžˆ ๋™์ผํ•œ warning์ด๋ผ๋ฉด, ์™œ sin_addr ํ•„๋“œ๊ฐ€ uninitialized ์ƒํƒœ๊ฐ€ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋‚˜์š”?

ing-eoking commented 4 months ago

@jhpark816

๋™์ผํ•œ warning์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ์ด์œ ๋ฅผ ๋งํ•ด์ฃผ์ง„ ์•Š์•„ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด์— ๋Œ€ํ•ด ๊ด€๋ จ ๋ฌธ์„œ์—์„œ๋Š” ํ™•์‹คํ•˜๊ฒŒ ์•Œ์ˆ˜๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์šฐ์„  getpeername์ด Success ์ผ ๊ฒฝ์šฐ addr์ด ์ฑ„์›Œ์ง€๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด์•˜์„ ๋•Œ๋Š” ๊ทนํžˆ ๋“œ๋ฌธ ์ผ€์ด์Šค์—์„œ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Unix ํ™˜๊ฒฝ์—์„œ FTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉ์ค‘์ด๊ณ , STDIN์„ Socket ํŒŒ์ผ(sfd = 0)๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ํ•œ ์ƒํ™ฉ์—์„œ getpeername์„ ํ˜ธ์ถœ ํ•œ ๊ฒฝ์šฐ ์ฃผ์†Œ ์ €์žฅ์ด ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋งํฌ : https://kldp.org/node/101825

jhpark816 commented 4 months ago

@ing-eoking

๋™์ผํ•œ warning์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ing-eoking commented 4 months ago

@jhpark816

์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Analyzer์—์„œ ๋ณด์—ฌ์ฃผ๋Š” warning ์ž์ฒด๋ฅผ ํ•œ๋ฒˆ ๋ณด์—ฌ์ฃผ์‹œ์ฃ .

๋ฐœ์ƒํ•œ warning์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์  Link

memcached.c:732:42: warning: Passed-by-value struct argument contains uninitialized data (e.g., field: 's_addr') [core.CallAndMessage]
        snprintf(c->client_ip, 16, "%s", inet_ntoa(addr.sin_addr));

Clang static analyzer๋Š” ์ˆ˜ํ–‰ ์ค‘์˜ ๋ถ„์„์ด ์•„๋‹ˆ๋ผ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ •์  ๋ถ„์„์ด ์•„๋‹Œ๊ฐ€์š”? warning ์˜ˆ์ƒ ์›์ธ์€ ์ˆ˜ํ–‰ ๋„์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์œผ๋กœ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์–ด์„œ์š”.

์ •์  ๋ถ„์„์ด๋ฉฐ, CentOS7, MacOS ํ™˜๊ฒฝ์—์„œ ๊ตฌ๋™ํ–ˆ์„ ๋•Œ ์ด Warning์— ๋Œ€ํ•˜์—ฌ ์‹คํ–‰ ๋„์ค‘ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ ์€ ์—†์Šต๋‹ˆ๋‹ค.

jhpark816 commented 4 months ago

@ing-eoking ์•„๋ž˜์™€ ๊ฐ™์ด getpeername() ์ˆ˜ํ–‰์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋งŒ memset() ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์–ด๋–ค๊ฐ€์š”? ๋™์ผํ•˜๊ฒŒ analyzer warning ๋ฐœ์ƒํ•˜๋‚˜์š”?

    /* save client ip address in connection object */
    struct sockaddr_in addr;
    socklen_t addrlen = sizeof(addr);
    if (getpeername(c->sfd, (struct sockaddr*)&addr, &addrlen) != 0) {
        if (init_state == conn_new_cmd) {
            mc_logger->log(EXTENSION_LOG_WARNING, c,
                           "getpeername(fd=%d) has failed: %s\n",
                           c->sfd, strerror(errno));
        }
        memset(&addr, 0, sizeof(addr));
    }
    snprintf(c->client_ip, 16, "%s", inet_ntoa(addr.sin_addr));
ing-eoking commented 4 months ago

๋„ค. ๋™์ผํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

memcached.c:733:38: warning: Passed-by-value struct argument contains uninitialized data (e.g., field: 's_addr') [core.CallAndMessage]
    snprintf(c->client_ip, 16, "%s", inet_ntoa(addr.sin_addr));
ing-eoking commented 4 months ago

localhost ๋กœ ์—ฐ๊ฒฐํ•œ ๊ฒฝ์šฐ

client_ip : 0.0.0.0

ip๋ฅผ 127.0.0.1๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ

client_ip : 127.0.0.1
jhpark816 commented 4 months ago

@ing-eoking