Неожиданное сворачивание строк с использованием 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}

0 ответов

Другие вопросы по тегам