﻿# V579\. The 'Foo' function receives the pointer and its size as arguments\. This may be a potential error\. Inspect the Nth argument\.

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

Рассмотрим, как подобная ошибка может возникнуть в коде\. Предположим, в начале имелся код следующего вида:

```cpp
char buf[100];
...
memset(buf, 0, sizeof(buf));
```

Код корректен\. Функция memset\(\) очищает массив из 100 байт\. Затем, код изменился, и буфер стал переменного размера\. Код очистки буфера изменить забыли:

```cpp
char *buf = new char[N];
...
memset(buf, 0, sizeof(buf));
```

Теперь код некорректен\. Оператор sizeof\(\) возвращает размер указателя, а не размер буфера с данными\. Как результат, функция memset\(\) очищает только часть массива\.

Рассмотрим другой пример, взятый из реального приложения:

```cpp
apr_size_t ap_regerror(int errcode,
  const ap_regex_t *preg, char *errbuf,
  apr_size_t errbuf_size)
{
  ...
  apr_snprintf(errbuf, sizeof errbuf,
    "%s%s%-6d", message, addmessage,
    (int)preg->re_erroffset);
  ...
}
```

В таком коде заметить ошибку непросто\.  Функция apr\_snprintf\(\) принимает в качестве аргумента указатель 'errbuf' и размер этого указателя 'sizeof errbuf'\. Анализатор считает этот код подозрительным и абсолютно прав\. Размер буфера находится в переменной 'errbuf\_size' и именно эту переменную следует использовать\. Корректный код:

```cpp
apr_snprintf(errbuf, errbuf_size,
  "%s%s%-6d", message, addmessage,
  (int)preg->re_erroffset);
```