Closed ing-eoking closed 3 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 ์ํ๊ฐ ๋๋ค๊ณ ์๊ฐํ๋์?
@jhpark816
๋์ผํ warning์ด ๋ฐ์ํ์ต๋๋ค. ์ ํํ ์ด์ ๋ฅผ ๋งํด์ฃผ์ง ์์ ํ์คํ์ง ์์ผ๋ฉฐ, ์ด์ ๋ํด ๊ด๋ จ ๋ฌธ์์์๋ ํ์คํ๊ฒ ์์๋ ์์์ต๋๋ค. ์ ๋ ์ฐ์ getpeername์ด Success ์ผ ๊ฒฝ์ฐ addr์ด ์ฑ์์ง๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค. ํ์ง๋ง ์ด์ ๋ํด ์ฐพ์๋ณด์์ ๋๋ ๊ทนํ ๋๋ฌธ ์ผ์ด์ค์์ ๋ณด์ฅ๋์ง ์๋ ๊ฒฝ์ฐ๋ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
Unix ํ๊ฒฝ์์ FTP ํ๋กํ ์ฝ์ ์ฌ์ฉ์ค์ด๊ณ , STDIN์ Socket ํ์ผ(sfd = 0)๋ก ๋ฆฌ๋ค์ด๋ ์ ์ ํ ์ํฉ์์ getpeername์ ํธ์ถ ํ ๊ฒฝ์ฐ ์ฃผ์ ์ ์ฅ์ด ๋์ง ์์๋ค๊ณ ํฉ๋๋ค. ๋งํฌ : https://kldp.org/node/101825
@ing-eoking
๋์ผํ warning์ด ๋ฐ์ํ์ต๋๋ค.
@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์ ๋ํ์ฌ ์คํ ๋์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์ ์์ต๋๋ค.
@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));
๋ค. ๋์ผํ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.
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));
client_ip : 0.0.0.0
client_ip : 127.0.0.1
@ing-eoking
๐ Related Issue
โจ๏ธ What I did
clang static analyzer ์์ ๊ฐ์งํ ์ผ์ด์ค ์ค ํ๋๋ฅผ ์์ ํฉ๋๋ค.
conn_new ์์๋ memset์ ํตํด addr ๋ณ์๋ฅผ ์ด๊ธฐํํ์ต๋๋ค.
conn_listening์์๋ socket accept ๊ณผ์ ์์ addr ๊ฐ์ด ํ ๋น๋๋ฏ๋ก getpeername ์ ์ ๊ฑฐํ์ต๋๋ค.