2016-02-12 4 views
1

Следующий вызов sprintf сбой при компиляции для арки i386. используя Android NDK. Я попытался скомпилировать как GCC, так и clang, и результат будет таким же. Я использую android-ndk-r10e (с APP_STL установлен в gnustl_shared с GCC, c++_shared с clang). Он работает как (I?), предназначенный для компиляции для ARM с той же конфигурацией, и, кроме того, когда я компилирую для i386 Linux с GCC 5.2.sprintf не работает, когда формат содержит символы, отличные от ASCII

int n = sprintf(buf, "\xc0%s", "test"); // n == 0, strlen(buf) == 0 

После вызова buf пуст, а не содержащий ожидаемую последовательность обугленного «\ xc0test». sprintf, кажется, игнорирует все после первого символа, отличного от ASCII. Следующий код пишет «тест» на buf, оставляя последние байты:

sprintf(buf, "%s\xc0", "test"); // strlen(buf) == 4 

С другой стороны, это работает отлично:

sprintf(buf, "%s", "test\xc0"); // strlen(buf) == 5 

Я озадачен.

ответ

2

Это известная проблема с Android. Проблема заключается в реализации Android libc (Bionic), что является довольно неполным с точки зрения соответствия стандартам. В частности, реализация Bionic stdio не поддерживает символы, отличные от ASCII.

Этот простой тест печатает strlen(buf)=4 когда строится Android NDK r10e:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char buf[256]; 
    sprintf(buf, "%s\xc0", "test"); 
    printf("strlen(buf)=%d\n", strlen(buf)); 
    return 0; 
} 

Решение: использовать CrystaX NDK - альтернативный вилке от Google Android NDK, где что были зафиксированы проблемы. Приведенный выше пример работает должным образом, если он построен кристаллом NDK 10.3.1:

strlen(buf)=5 
+0

Это отлично сработало для меня. Я вижу, что вы являетесь создателем CrystaX, поэтому большое вам спасибо. 'stdlib.h' не содержал' labs', но это было тривиально для исправления. – user1421750

+0

Хмм, на самом деле 'stdlib.h' содержит определение' labs'. Если у вас возникли проблемы с этим, не стесняйтесь сообщать об ошибке с минимальным воспроизводимым случаем в нашем трекере проблем - https://tracker.crystax.net/projects/ndk. –

Смежные вопросы