Почему Visual Studio не делает segfault при локальной компиляции? [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему Visual Studio не делает segfault при локальной компиляции? [дубликат]

Сообщение Anonymous »

Это вопрос по настройке кода Visual Studio, а НЕ вопрос по C++.
У меня есть код C++14 в файле с именем stall4.cpp, в котором есть ошибка в этом случае он вызывает сбой при компиляции в программу под названием «stall4» с использованием локальных команд. Удивительно, но он не дает сбоя при запуске отладчиком Visual Studio Code 1.76.2 C++ с использованием, казалось бы, идентичной команды
Вопрос:
Я не прошу помощи с сегфолтом. Я просто хочу знать, КАК мне заставить мой код работать в Visual Studio и мой локальный код вести себя одинаково, чтобы я мог затем использовать отладчик Visual Studio, чтобы добраться до корня ошибки сегмента.
Подробности:
Локально я компилирую с помощью
g++ -fdiagnostics-color=always -std=c++14 stall4.cpp -o stall4
Я считаю, что это именно та команда, которую Visual Studio Code использует для компиляции моего кода. Для любопытных: какой g++ выводит /usr/bin/g++ на моей Mac OS Sonoma 14.5. Более того, запуск g++ -v выводит обычный вывод clang
➜ stall4 git:(main) ✗ g++ -v
Apple clang version 15.0.0 (clang-1500.3.9.4)
Target: x86_64-apple-darwin23.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

Теперь Visual Studio Code компилирует его с помощью команды cppbuild в файле Tasks.json, который настроен следующим образом:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-std=c++14",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}

Я считаю, что моя команда и код Visual Studio ИДЕНТИЧНЫ, но очевидно, что я НЕ думаю, что мой код работает, а код Visual Studio ДЕЛАЕТ< /em> думаю, что мой код работает.
Теории:
  • Возможно, визуальный элемент g++ studio чем-то отличается от G++ по умолчанию в моей системе?
    i. Это можно было бы проверить, если бы при компиляции Visual Studio я мог выполнить команду, например, g++ и g++ -v, перед выполнением компиляции g++. Я не знаю, как это сделать.
  • Возможно, когда Visual Studio запускает мой код, она делает это в среде, отличной от той, в которой я работаю. запуск ./stall4 в локальном каталоге моей программы. В результате, когда я выполняю какую-то сомнительную операцию с указателем в MAC OS, я получаю ошибку segfault, но когда версия моего кода для Visual Studio делает то же самое, это просто продолжается без изменений.
    i. Подсказка: если бы я мог заставить Visual Studio печатать pwd перед запуском моего кода, чтобы я мог буквально увидеть, откуда он работает на моей машине, в случае, если это виртуальная машина, которая, вероятно, будет выглядеть иначе, чем моя локальная система. .
Очевидно, что в моем коде есть ошибка, несмотря на то, что Visual Studio считает, что все в порядке. Я просто не знаю, как заставить Visual Studio заметить эту проблему.
Я также приложил код ниже, если кто-то захочет воспроизвести эту ошибку. Он возник в результате работы над практической задачей для олимпиады по вычислительной технике в США, а именно над задачей «stall4» в разделе 2 главы 4. Общедоступное описание которой можно найти здесь
ID: redacted
LANG: C++14
TASK: stall4
*/

#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;

//we need to generate one like this each time
unordered_map cow_to_stall;

int cow_count;
int stall_count;
int solution_threshold;

struct cow_vertex {
unordered_map& cow_to_stall;
int next_cow_idx;
int current_sol_score;
unordered_set& remaining_cows;
// Custom copy assignment operator
cow_vertex& operator=(const cow_vertex& other) {
// 1. Copy the fixed value
cow_to_stall = other.cow_to_stall;
next_cow_idx = other.next_cow_idx;
current_sol_score = other.current_sol_score;
remaining_cows = other.remaining_cows; //why do i have to implement this ?

// Return *this to allow chaining of assignments
return *this;
}
};

struct scan_output {
// unordered_map *reduced_stall; pass by reference means this can be a side effect
int next_cow_idx;
int cows_set;
int cows_remaining_count;
// unordered_set *remaining_cows; pass by reference means this can be a side effect
};

vector cow_exploration_stack;

void set_difference(unordered_set &A, unordered_set &B) { //implements A - B
for (int item: B) {
A.erase(item);
}
return;
}

//think about the difference between cows and stalls!
scan_output get_next_cow(unordered_map& reduced_stall, unordered_set& remaining_cows) {
bool set_flag = true;
int multi_stall_cow_count;
unordered_set locally_set_cows;
unordered_set locally_set_stalls;
int total_cows_set = 0;
int local_size = 0;
int next_cow_idx;
while (set_flag) {
set_flag = false;
multi_stall_cow_count = 0;
next_cow_idx = cow_count+1;
for (int i: remaining_cows) {
set_difference(reduced_stall, locally_set_stalls);
local_size = reduced_stall.size();
if (local_size == 1) {
set_flag = true;
locally_set_stalls.insert(*(reduced_stall.begin()));
locally_set_cows.insert(i); //we don't want to visit this cow again
total_cows_set++;
} else if (local_size > 1) {
if (next_cow_idx > i) {
next_cow_idx = i;
}
multi_stall_cow_count++;
} else if (local_size ==0) {
locally_set_cows.insert(i);
}
}
//so locally set cows should NOT be visited twice
set_difference(remaining_cows, locally_set_cows);
//locally set stalls need not be trimmed that optimization didn't seem to be very valuable in python3
locally_set_cows = {}; //we then set it to the empty set
}
scan_output return_structure = {next_cow_idx, total_cows_set, multi_stall_cow_count};
return return_structure;
}

//solve returns the maxmimal number
int solve() {
int initial_cow_idx = 1;
int best_score = 0;
unordered_set remaining_cows = {};
for (int i = 1; i = solution_threshold) {
return best_score;
}

cow_vertex next_cow_vertex = {cow_to_stall, best_score, initial_cow_idx, remaining_cows};
cow_exploration_stack.push_back( next_cow_vertex );

while (cow_exploration_stack.size() > 0) {
next_cow_vertex = cow_exploration_stack.back();
cow_exploration_stack.pop_back();
unordered_map& local_cow_to_stall = next_cow_vertex.cow_to_stall;
int next_idx = next_cow_vertex.next_cow_idx;
unordered_set& local_remaining_cows = next_cow_vertex.remaining_cows;
int local_score = next_cow_vertex.current_sol_score;
cout > stall_count;

//now we have lines for each cow
for (int i = 0; i < cow_count; i++) {
int local_stall_count;
input >> local_stall_count;
cow_to_stall = unordered_set{};
for (int j = 0; j < local_stall_count; j++) {
int acceptable_stall;
input >> acceptable_stall;
cow_to_stall.insert(acceptable_stall);
}
}

input.close();

//cout

Подробнее здесь: https://stackoverflow.com/questions/790 ... s-segfault
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»