2016-09-10 4 views
0

soap_strcpy의 반환 값이 무엇인지 궁금합니다.어떻게이 매크로를 해석 할 수 있습니까?

# define soap_strcpy(buf, len, src) (void)((buf) && (size_t)(len) > 0 && (strncpy((buf), (src), (len) - 1), (buf)[(len) - 1] = '\0')) 

내 도구에서 반환 값이 항상 거짓임을보고합니다. 아래의 마지막 조건은 일종의 일반적인 표현입니까? 어떻게 해석 할 수 있습니까?

(strncpy((buf), (src), (len) - 1), (buf)[(len) - 1] = '\0')) 
+0

@NGI 예. 'operator &&'는 매개 변수 평가 순서가 정의되지 않은 규칙에 대한 예외입니다. 'operator &&'는 왼쪽에서 오른쪽으로 평가되고 LHS가 거짓이면 RHS를 평가하지 않습니다. 'if (ptr && * ptr == whatever)'은 매우 일반적으로 사용되는 구조이며, 이것이 사실이 아니라면 유효하지 않을 것이라고 생각하십시오. –

+0

@Miles Budnek [부 표현의 평가 순서 나 부작용이 나타나는 순서에 의존하지 마십시오] (https://www.securecoding.cert.org/confluence/display/c)의 잘못된 일반화 문제를 고쳐 주셔서 감사합니다. /EXP10-C.+Do+not+depend+on+the+order+of+evaluation+of+subexpressions+or+the+order+in+which+side+effects+take+place) – NGI

답변

0

(strncpy에서 ((BUF) (SRC) (LEN) - 1), (BUF) (LEN) - 1] = '\ 0'))

Comma operator? 지금은 분명해?

쉼표로 구분 된 목록은 표현식의 값이 목록의 마지막 평가 결과입니다.

마지막 표현식이 0 인 과제이므로 물론 0이됩니다. 이것은 전체 목록의 평가가 쓸모 없다는 것을 의미하지는 않습니다 : 첫 번째 용어 사본, 마지막 용어는 사본을 제로 문자로 종결합니다.

+0

답장을 보내 주셔서 감사합니다. 자, 내 도구가이 매크로의 마지막 조건을 잘못 해석했다고 잘못 생각한 것 같습니다. –

+0

@kongdol 할당 값은 할당 된 값입니다. 이것을보십시오'int foo() {int a; a = 1을 반환; }'반환 값을 확인하십시오. 당신이 그것을 생각한다면 그것은 의미가 있습니다. 왜냐하면 'int a = b = 1;' 'a'와'b'가 모두 1로 설정되어야하기 때문에,'b'의 값은'a'에 할당되어야합니다. –

관련 문제