Deb4ik
@Deb4ik
Студент, люблю С++

Компиляция C++ кода на Ubuntu и Windows даёт мне разный результат, почему?

Приветствую, столкнулся с проблемой в процессе написания курсовой работы. В чём суть, я писал программу шифрования данных алгоритмом NUSH, но в процессе написания мой код выдаёт постоянно разный вывод на винде, пока на линуксе всё отлично. Компилировал через CMake, явно указал стандарт языка (stdc++11). Уже не знаю что делать, может быть это MinGW шалит, т.к. я использую его генератор (-G "MinGW Makefiles").

Вот мои исходники:

main.cpp - https://pastebin.com/W3KvUMBM
tools.h - https://pastebin.com/RZg8PYJ2
tools.cpp - https://pastebin.com/dEp5KEG0

CMakeLists.txt
cmake_minimum_required(VERSION 3.22 FATAL_ERROR)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED On)
set(CMAKE_CXX_EXTENSIONS Off)

project(NUSH)

add_executable(NUSH main.cpp tools.h tools.cpp)


P.S. От ответов "В гугле забанили" воздержитесь, я пытался гуглить, ничего не вышло. Скорее всего плохо искал, но я пытался...

P.P.S Правильный ответ должен быть такой 54 78 1d e7 63 fb fe 1c
  • Вопрос задан
  • 243 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Уже не знаю что делать

Не знаешь что делать -- включай санитайзеры:
$ g++ -std=c++11 -g -fsanitize=undefined -fsanitize=address main.cc tools.cc -o test
$ ./test
==3245365==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x606000000060 at pc 0x55b559719b47 bp 0x7ffcc39300a0 sp 0x7ffcc3930098
READ of size 8 at 0x606000000060 thread T0
    #0 0x55b559719b46 in Processor::encode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) toster/1320980/main.cc:41


mainc.cc:41 это std::bitset<16> KR = K_array[i];, цикл по i идёт до 9, а в массиве K_array 8 элементов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Скорее всего там где-то Undefined behavior. Например, выход за границу массива. Вы там вектора везде возвращаете, но может быть там вы где-то его заполняете на на ожидаемые 8 позиций.

Советую переписать код. Возвращайте std::array<std::bitset<16>,4> например. Вместо push_back сразу обращайтесь к i-ому элементу ответа.

Далее, у вас там 2 функции делают одно и то же - разбивают большой bitset на несколько маленьких. Напишите template функцию, которая выделяет из битсета длиной N битсет длиной M со сдвигом offset. Внутри просто циклом присваивайте res[i] = input[i+offset].

Переписав и упрастив вот так вот код, вы, возможно, исправите ошибку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы