Я работаю над платформой AVR. avr-libc не предоставляет asprintf()
. Мне нужна библиотека, которую я пытаюсь внести в мой проект. Полезно, что эта же библиотека включает реализацию (ниже). К сожалению, это дает нечетные результаты. В частности, я определил, что код возврата vsnprintf()
никогда не верен; а не случайные результаты, я, кажется, всегда вижу одинаковое прогрессирование неправильных значений (5, 1 и т. д.) при последовательных вызовах.Нечетное поведение vsnprintf на AVR ATmega2560
Звонок этой функции: asprintf(&str, "%s[%d]", name, val);
. str
- это char*
в стеке в вызывающей функции. name
- простой короткий текстовый дескриптор, который я проверил, не является нулевым, а не нулевым. val
- простой индекс, который увеличивается в цикле, который вызывает asprintf()
. Результирующая строка, создаваемая этим вызовом, должна содержать 7 символов (не считая нулевого терминатора). asprintf()
называется во всей библиотеке. Мое использование содержащейся библиотеки выполняется только в этом одиночном цикле (дважды). Библиотека выполняет свою работу, как ожидалось, если я удалю этот вызов и заменим результаты фиктивными значениями. Выполнение, казалось бы, сбой при назначении буфера разыменованному ret
указателю в рамках реализации asprintf()
.
Несмотря на множество экспериментов с буферами, разыменование указателя и управление var args, я не могу заставить эту функцию работать должным образом. Однако, скомпилированный на OS X, он работает отлично.
Я знаю, что поведение vsnprintf()
не обязательно идентично для всех платформ. Тем не менее, насколько я могу судить, это использование должно работать так, как ожидалось.
Любые идеи? Может ли это быть вне самой функции? Какой-то вариант инициализации stdio или библиотеки библиотек, вызывающий проблемы?
int asprintf(char **ret, const char *fmt, ...) {
va_list ap1;
va_list ap2;
int count;
va_start(ap1, fmt);
va_copy(ap2, ap1);
count = vsnprintf(NULL, 0, fmt, ap1);
va_end(ap1);
if(count > 0) {
char* buffer;
if (!(buffer = (char*)malloc(count+1))) {
return -1;
}
count = vsnprintf(buffer, count+1, fmt, ap2);
*ret = buffer;
}
va_end(ap2);
return count;
}
«прогрессирование неправильных значений (5, 1 и т. Д.) При последовательных вызовах. Каковы входы в эти успешные вызовы? Это помогло, если вы показали фактические вызовы 'asprintf'. – dxiv
Хорошая точка. Вопрос обновлен, чтобы описать, как эта функция вызывается. –
Объявлен ли 'asprintf' (с правильным прототипом) в заголовке, который входит в оба модуля, которые реализуют, соответственно, вызов? – dxiv