В чем может быть проблема?
struct IDTPtr {
uint16_t limit;
uint32_t base;
};
packed
, иначе компилятор вставляет паддинг для выравнивания поля base
на границу uint32_t
, из-за чего в IDT загружается неверный адрес.iret
из середины с++-функции, потому что компилятор организовал в ней кадр стека и вместо возврата iret
снимает и интерпретирует мусор из этого кадра:001000e6 <SimpleOS::IDT::dividing_by_zero()>:
1000e6: 55 push %ebp
1000e7: 89 e5 mov %esp,%ebp
1000e9: 53 push %ebx
1000ea: 83 ec 04 sub $0x4,%esp
1000ed: e8 15 01 00 00 call 100207 <__x86.get_pc_thunk.ax>
1000f2: 05 06 11 00 00 add $0x1106,%eax
1000f7: 83 ec 0c sub $0xc,%esp
1000fa: 8d 90 08 fe ff ff lea -0x1f8(%eax),%edx
100100: 52 push %edx
100101: 89 c3 mov %eax,%ebx
100103: e8 4c 00 00 00 call 100154 <SimpleOS::Terminal::print(char const*)>
100108: 83 c4 10 add $0x10,%esp
10010b: fa cli
10010c: cf iret
10010d: 90 nop
10010e: 8b 5d fc mov -0x4(%ebp),%ebx
100111: c9 leave
100112: c3 ret
$ gcc -m32 boot.s -nodefaultlibs -nostartfiles -Wl,-Tlinker.ld -no-pie -o boot.elf
$ readelf -S boot.elf
There are 8 section headers, starting at offset 0x3140:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .note.gnu.bu[...] NOTE 00100000 001000 000024 00 A 0 0 4
[ 2] .multiboot PROGBITS 00101000 003000 00000c 00 0 0 4096
[ 3] .text PROGBITS 00102000 002000 000009 00 AX 0 0 4096
[ 4] .bss NOBITS 00103000 003000 004000 00 WA 0 0 4096
[ 5] .symtab SYMTAB 00000000 00300c 0000a0 10 6 9 4
[ 6] .strtab STRTAB 00000000 0030ac 00004d 00 0 0 1
[ 7] .shstrtab STRTAB 00000000 0030f9 000044 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
D (mbind), p (processor specific)
.multiboot
оказалась по смещению 0x3000. Сигналы доходят до меги, но она не включает ни один из светиков.
Для выхода из вложенных циклов при try/catch в случае исключения произойдёт свертка стека
будет ли тоже самое для goto?
… 75% cpu 2:23,52 total
… 113% cpu 1:22,71 total
… 73% cpu 2:20,75 total
количество потоков в программе равно количеству потоков процессора (в моём случае - 8…
Как быть?
понял что проект VS обязательно должен быть оконным, в противном случае тупо не будет ресурсов
выяснил что проблема в sizeof(buf) который почему то равен 8 после передачи в функцию
как я могу это сделать?
include <файл в конце стрелки>
в h файл в начале стрелки. Стрелки использования добавляют include <файл в конце стрелки>
в cc файл в начале стрелки. ONESTOPBIT ломало передачу блока
DWORD ComIface::write(byte* data, int count)
DWORD ComIface::read_block(byte* buffer, int size)
hpet rt; while (get_stats().cbInQue < size) { if (!SetCommMask(port_handle, EV_RXCHAR)) { printf("SetCommMask failed with error %d.\n", GetLastError()); return NumberOfBytesRead; } WaitCommEvent(port_handle, &status, &overlap); WaitForSingleObject(overlap.hEvent, read_delay); if (rt.get_ms_dt_weak().count() > read_delay * size) { return NumberOfBytesRead; } }
Какие проблемы приводят к такому и как это чинить?
что я сделал не так, подскажите пожалуйста
if (b[i] >= x || b[i] <= y) { a[j] = b[i]; j++; } ... if (b[i] < x || b[i] > y) { a[j] = b[i]; j++; }
if
не являются взаимоисключающими, а значит j
может стать больше чем n
и запись в a[j]
вылезет за границу массива.if (!(b[i] >= x || b[i] <= y))
и это гарантирует, что индекс не выйдет за пределы массива, вне зависимости от правильности первого условия. initialization of 'hInstanse' is skipped by 'case' label, почему?
switch (uMsg) { ... case WM_CREATE: //получаем дескриптор приложения HINSTANCE hInstance = GetModuleHandle(0); ... break; case WM_MOUSEMOVE: //устанавливаем тот или иной курсор в зависимости от местонахождения мыши ...
WM_MOUSEMOVE
код попадёт в область где hInstance определён, но минует его инициализацию. Компилятор туповат, чтобы понять, что hInstance дальше не используется. Простейший фикс -- обернуть код обработчиков в блоки:switch (uMsg)
{
...
case WM_CREATE:
{
//получаем дескриптор приложения
HINSTANCE hInstance = GetModuleHandle(0);
...
}
break;
case WM_MOUSEMOVE:
{
//устанавливаем тот или иной курсор в зависимости от местонахождения мыши
...
}
...
считать количество русских букв, однако он не правильно это делает, что не так?
setlocale(LC_ALL, "");
const char *str = input.c_str();
while (*str) {
wchar_t c;
int n = mbtowc(&c, str, MB_CUR_MAX);
if (n < 0)
break;
if (wcschr(L"абвгд...юя", c))
++count;
str += n;
}
ctypes.restype(outdata)
, где outdata
-- тип rez1
, см), либо переделать функцию так, чтобы она не требовала скрытого параметра (например, добавив явный указатель на результат в список параметров, см). D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:91: undefined reference to `sp3_THE' D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:91: undefined reference to `sp3_THE' D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:92: undefined reference to `sp3_TIME'
В чему может быть проблема ?
Как можно улучшить код?
d = n < 0 ? -n : n
выглядит куда лучше семистрочного if/else.if(n<0) {
cout<<"-";
}
Уже не знаю что делать
$ 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
std::bitset<16> KR = K_array[i];
, цикл по i идёт до 9, а в массиве K_array 8 элементов. поэтапаный алгоритм определения размера
Единицы трансляции ведь загружаются в произвольном порядке?
Каким образом наличие слова constinit в одной из единиц трансляции гарантирует, что она загрузится раньше?