Неожиданное сворачивание строк с использованием SunCC 5.15 в Solaris?
Я работаю над Solaris 11.3 с SunCC 5.15 от Sun Studio 12.6. Я пытаюсь понять сбой самопроверки, которая использует двоичные строки. Бинарные строки представляют собой данные в кодировке ASN.1.
У меня есть данные в структуре:
struct ASN1_TestTuple
{
int disposition;
int identifier;
const char* name;
const char* data;
size_t len;
};
И данные под вопросом:
{ACCEPT, BIT_STRING, "BIT_STRING", "\x03\x82\x00\x02" "\x00" "C", 6},
{REJECT, BIT_STRING, "BIT_STRING", "\x03\x82\x00\x02" "\x08" "C", 6},
{REJECT, BIT_STRING, "BIT_STRING", "\x03\x82\xff\xff" "\x00" "C", 6},
Хороший самопроверка в AIX, BSD, Linux и Windows выглядит так:
passed: accept BIT_STRING 038200020043
passed: reject BIT_STRING 038200020843
passed: reject BIT_STRING 0382FFFF0043
На Solaris с использованием SunCC 5.15:
passed: accept BIT_STRING 038200020043
FAILED: reject BIT_STRING 038200020043
passed: reject BIT_STRING 0382FFFF0043
Обратите внимание, что в неудачном регистре вместо буквы C стоит 0x00, а это 0x43. Похоже, что компилятор Sun сложил строки, но они не были одинаковыми.
Я просматривал сообщения о комбинировании смежных строк, чтобы найти угол, где я делаю что-то не так, но я не нашел его (пока?). Я полагаю, что литералы правильно комбинируются в соответствии с тем, Как правильно добавить шестнадцатеричные escape-символы в строковый литерал?
У меня вопрос, сделал ли я что-то, чтобы нарушить стандарты, или это неожиданное поведение компилятора?
Проблема может быть замечена под GDB. ASN1_TestTuple::data
поле является одним и тем же адресом для обоих тестов. Ниже, data
является 0x1282b57
для двух тестов:
Breakpoint 3, CryptoPP::Test::RunASN1TestSet (
asnTuples=0x236a0a0 <.XDAAAAAux4Ub0SI.__1fICryptoPPETestNTestASN1Parse6F_b1AKbitStrings_>, count=0x13) at validat0.cpp:1235
1235 const ASN1_TestTuple & thisTest = asnTuples[i];
(gdb) n
1236 ArraySource as1((const byte*)thisTest.data, thisTest.len, true);
(gdb) p thisTest
$13 = (const CryptoPP::Test::ASN1_TestTuple &) @0x236a1e0: {disposition = 0x4,
identifier = 0x3, name = 0x1282b89 "BIT_STRING",
data = 0x1282b57 "\003\202", len = 0x6}
(gdb) c
Continuing.
passed: accept BIT_STRING 038200020043
Breakpoint 3, CryptoPP::Test::RunASN1TestSet (
asnTuples=0x236a0a0 <.XDAAAAAux4Ub0SI.__1fICryptoPPETestNTestASN1Parse6F_b1AKbitStrings_>, count=0x13) at validat0.cpp:1235
1235 const ASN1_TestTuple & thisTest = asnTuples[i];
(gdb) n
1236 ArraySource as1((const byte*)thisTest.data, thisTest.len, true);
(gdb) p thisTest
$14 = (const CryptoPP::Test::ASN1_TestTuple &) @0x236a200: {disposition = 0x3,
identifier = 0x3, name = 0x1282b89 "BIT_STRING",
data = 0x1282b57 "\003\202", len = 0x6}
(gdb) c
Continuing.
FAILED: reject BIT_STRING 038200020043
А вот третий набор данных, который показывает изменения поля данных, как и ожидалось:
Breakpoint 3, CryptoPP::Test::RunASN1TestSet (
asnTuples=0x236a0a0 <.XDAAAAAux4Ub0SI.__1fICryptoPPETestNTestASN1Parse6F_b1AKbitStrings_>, count=0x13) at validat0.cpp:1235
1235 const ASN1_TestTuple & thisTest = asnTuples[i];
(gdb) n
1236 ArraySource as1((const byte*)thisTest.data, thisTest.len, true);
(gdb) p thisTest
$15 = (const CryptoPP::Test::ASN1_TestTuple &) @0x236a220: {disposition = 0x3,
identifier = 0x3, name = 0x1282b89 "BIT_STRING",
data = 0x1282b50 "\003\202\377\377", len = 0x6}
Я не верю, что мне не хватает опции компилятора для включения / выключения свертывания:
$ /opt/developerstudio12.6/bin/CC -help | /usr/gnu/bin/egrep 'string|fold'
-mc Remove duplicate strings from .comment section of output files
-mr Remove all strings from .comment section of output files
-mr,"string" Remove all strings and append "string" to .comment section
-xustr=<a> Recognize sixteen-bit string literals; <a>={ascii_utf16_ushort|no}