Форум программистов, компьютерный форум CyberForum.ru

очень интересный баг - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
30.07.2009, 17:42     очень интересный баг #1
Если кто-нибудь догадается в чем ошибка, то скажите. Ошибку я уже исправил, но не знаю, почему не работает этот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <conio.h>
 
int CompareFaceStat(char mass[100], char mass1[100]) {
    int count=0;
    for(int i=0;i<100;i++)
    {
        if(mass[i]>>6==mass1[i]>>6) count++;
        if(mass[i] << 2 >> 6==mass1[i] << 2 >> 6) count++;
        if(mass[i] << 4 >> 6==mass1[i] << 4 >> 6) count++;
        if(mass[i] << 6 >> 6==mass1[i] << 6 >> 6) count++;
    }
    return count;
}
 
 
int MultiCompareFaceStat(char RecordDB[2004], char mass[100])
{
    int count1=0;
    char mass1[100];
    int compareOld=0;
    int compareNew=0;
    count1|=((int)RecordDB[0])<<24;
    count1|=((int)RecordDB[1])<<16;
    count1|=((int)RecordDB[2])<<8;
    count1|=((int)RecordDB[3]);
    for(int i=0;i<count1;i++)
    {
        strncat(mass1,(RecordDB+i*100+4),100);
        compareNew=CompareFaceStat(mass,mass1);
        if(compareOld<compareNew) compareOld=compareNew;
    }
    return compareOld;
}
void wmain()
{
    char mass1[2004];
    char mass[100];
    mass1[0]=0;
    mass1[1]=0;
    mass1[2]=0;
    mass1[3]=20;
    for(int i=4;i<2004;i++)
    {
        mass1[i]=19;
    }
    for(int i=0;i<100;i++)
        mass[i]=14;
    std::cout<<sizeof(char)<<std::endl;
    getch();
    int c=MultiCompareFaceStat(mass1,mass);
    std::cout<<c<<std::endl<<mass1[0]<<mass1[1]<<mass1[2]<<mass[3]<<std::endl;
 
    getch();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 17:53     очень интересный баг #2
Цитата Сообщение от Poleno Посмотреть сообщение
. Ошибку я уже исправил, но не знаю, почему не работает этот код:
а почему он должен работать?
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
30.07.2009, 18:06  [ТС]     очень интересный баг #3
Код должен работать. Ошибка вылетает при выполнении. Указатель на mass в функции MultiCompareFaceStat становится плохим после выполнения функции копирования строки. Но почему так происходит я даже не представляю.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 18:19     очень интересный баг #4
Цитата Сообщение от Poleno Посмотреть сообщение
Указатель на mass в функции MultiCompareFaceStat становится плохим после выполнения функции копирования строки
что значит "плохим"? ясное дело, что в указатель копируется "кака".

Добавлено через 9 минут 18 секунд
Цитата Сообщение от Poleno Посмотреть сообщение
char mass1[2004];
char mass[100];
очень плохие имена. вы легко можете спутать mass1 и mass.
назовите их barby и ken
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
30.07.2009, 19:21  [ТС]     очень интересный баг #5
И еще. Небольшая просьба. Я сам опытный разработчик на C++. Не первый год им занимаюсь. Поэтому не надо учить меня, как и что делать. Если вам не так сложно, или просто интересно(как и мне) то посмотрите, что здесь неправильно. Потому что сам код выглядит абсолютно нормальным и без ошибок. А почему-то не работает. Я его уже у себя в офисе показывал - все раскрывают глаза и не понимают, что не так.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 22:01     очень интересный баг #6
Цитата Сообщение от Poleno Посмотреть сообщение
Я сам опытный разработчик на C++. Не первый год им занимаюсь. Поэтому не надо учить меня, как и что делать.
без комментариев. опытный разработчик...
по коду не скажешь...
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
30.07.2009, 22:03  [ТС]     очень интересный баг #7
А можешь просто написать в чем ошибка - т.е. ответить на мой изначальный вопрос? Флудить все умеют. Если скажешь правильный ответ от меня большая благодарность. Правда, не денежная.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 22:13     очень интересный баг #8
я сейчас сериал смотрю. не могу отвлекаться. если завтра будет свободное время - посмотрю ваш чудо-код.
***
кстати, что он должен делать?
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
30.07.2009, 22:40  [ТС]     очень интересный баг #9
Да, это правильно. Но не знаешь, случаем, почему после выполнения этой операции strncat(mass1,(RecordDB+i*100+4),100); массив mass начинает ссылаться на совершенно другую область памяти (в информации при отладке пишет bad pointer - плохой указатель). Насколько я понимаю, в этой строке массива mass нет вообще, а тем не менее, адрес его меняется после выполнения этой строки. Я просто в недоумении.

Добавлено через 22 минуты 1 секунду
Этот код должен считать количество совпадений пар битов. Т.е. для дыух чисел 10 10 00 10 и 10 10 01 10 это будет три. Там он ищет количество совпадений в 20 записях по 100 байт каждая.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,314
31.07.2009, 00:00     очень интересный баг #10
Цитата Сообщение от Poleno Посмотреть сообщение
Указатель на mass в функции MultiCompareFaceStat становится плохим после выполнения функции копирования строки. Но почему так происходит я даже не представляю.
Где "опытный разработчик на C++" видит функцию копирования строки??? Я - не вижу. Даже под микроскопом.
А диагноз простой: в функции MultiCompareFaceStat ты элементарно сразу же вылезаешь за границу автоматического массива mass1 и тупо портишь стек. Все. И это вскрывается сразу же - вероятно, уже при второй попытке записи. Ровным счетом ничего интересного в этой ошибке нет.
Интереса для можешь посмотреть это все в отладчике.
Alexandoros
226 / 64 / 4
Регистрация: 02.06.2009
Сообщений: 280
31.07.2009, 00:07     очень интересный баг #11
Цитата Сообщение от Poleno Посмотреть сообщение
Я сам опытный разработчик на C++. Не первый год им занимаюсь. Поэтому не надо учить меня, как и что делать.


Открой для себя дебугер, и "очень интересные баги" станут очень понятными.
Atrus
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 45
31.07.2009, 00:19     очень интересный баг #12
так ты ж его сам же и потер. надо не i*100+4 а i*100+3 в стрнкате писать.
ты на байт за границу mass1 вылез, а сразу за ним у тебя mass идет
p.s. этот код брутален и бессердечен. Ты бы хоть коменты к нему добавил.
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
31.07.2009, 09:55  [ТС]     очень интересный баг #13
На единицу не выходит. Функция берет из массива 100 байт - т.е. от 0 до 99 байт включительно. Здесь все нормально.

Добавлено через 1 минуту 5 секунд
Это мой первый пост. Поэтому в следующих будут комменты.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,314
31.07.2009, 10:20     очень интересный баг #14
Да не имеет значения, сколько точно она там берет - на единицу больше или меньше.....
Просто дай ответы на два вопроса:
1. Что именно делает функция strncat ? (можно заглянуть в MSDN)
2. Что именно содержится в автоматическом массиве mass1 перед началом выполнения первой итерации цикла for ? (можно использовать отладчик)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2009, 16:26     очень интересный баг
Еще ссылки по теме:

C++ Очень странный баг
Интересный пример оптимизации C++
C++ Странная ошибка при компиляции очень очень большой проги ,,boomerang,,
C++ Интересный "баг" в коде
C++ Посоветуйте интересный class

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Patch
05.08.2009, 16:26     очень интересный баг
  #15

Не по теме:

блин...
и у них целый офис "опытных разработчиков"!
интересно, что они разрабатывают?
мне уже страшно...

Yandex
Объявления
05.08.2009, 16:26     очень интересный баг
Ответ Создать тему
Опции темы

Текущее время: 08:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru