Поведение getsockname, когда name = null

У меня есть код в Windows, который вызывает getsockname следующим образом:

getsockname(*x,NULL,0)

третий параметр (namelen) является параметром IN\Out и содержит размер буфера имени в байтах. По возвращении параметр namelen содержит фактический размер в байтах параметра name.
Теперь мой вопрос: что произойдет, если имя равно нулю, а namelen равно нулю? Я видел, что в linux, если имя NULL, namelen игнорируется, но MSDN ничего не упоминает об этом случае. Ссылка MSDN здесь Ссылка IBM для Linux здесь

заранее спасибо

1 ответ

Решение

В вашем коде вы передали ноль для третьего параметра.

Третий параметр не может быть нулевым, в соответствии со спецификацией, он должен быть указателем на целое число, дающее длину второго параметра, а на выходе дает фактический размер адреса. Передача нуля не означает, что вы говорите, что хранилище не было выделено, это означает, что вы говорите, что не передали информацию и нигде не записали выходное значение.

Согласно документации MSDN и Linux, функция должна вернуть -1 и установить errno в EFAULT (или WSAGetLastError to WSAEFAULT на в окнах розетки). Это определяется как "Использование параметров name и namelen, как указано, приведет к попытке доступа к хранилищу вне адресного пространства вызывающего".

Однако это не является частью спецификации Posix, и я не воспринимаю это как требование функции проверять адреса - просто это возможно. Другими словами, по крайней мере, в Posix это неопределенное поведение. Это означает, что все может случиться.

В Linux вы говорите, что заметили, что два параметра игнорируются, если передается значение null. Я подозреваю, что ваш код не проверяет возвращаемое значение, которое, вероятно, будет -1 с errno установлен в EFAULT,

Функции Posix не генерируют исключения. Вы должны проверить код возврата, возможно, что-то вроде этого:

int result = getsockname(*x,NULL,0); 
if(result){
    /*Failed - handle here*/ 
} 
Другие вопросы по тегам