Ошибка c6385 c

Sunshine_1

0 / 0 / 0

Регистрация: 16.09.2020

Сообщений: 3

1

16.09.2020, 08:27. Показов 9891. Ответов 12

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
int main() 
{
    int n, j, i, k,m;
    cout.precision(4);
    cout.setf(ios::fixed);
    cout << "nEnter the no. of equationsn";
    cin >> n;
    m = n + 1;
    double** p = new double*[n];
    for ( int count = 0; count < n; count++)
    {
        p[count] = new double[m];  // x[n]
 
    }
    double** x = new double*[n];
    for (int count = 0; count < n; count++)
    {
        x[count] = new double[n];
    }
    cout << "nEnter the elements:n";
    for (i = 0; i < n; i++) {
        for (j = 0; j <= n; j++) {
            cin >> p[i][j];
        }
            
    }
        
    for (i = 0; i < n; i++){
        for (k = i + 1; k < n; k++) {
            if (abs(p[i][i]) < abs(p[k][i]))
                for (j = 0; j <= n; j++)
                {
                    double temp = p[i][j];
                    p[i][j] = p[k][j];
                    p[k][j] = temp;
                } 
        }
    }
    cout << "nThe matrix after Pivotisation is:n";
    for (i = 0; i < n; i++)
    {
        for (j = 0; j <= n; j++) {
            cout << p[i][j] << setw(16);
            cout << "n";
        }
    }
    for (i = 0; i < n - 1; i++) {          
        for (k = i + 1; k < n; k++)
        {
            double t = p[k][i] / p[i][i];
            for (j = 0; j <= n; j++)
                p[k][j] = p[k][j] - t * p[i][j];    
        }
    }
    cout << "nnThe matrix after gauss-elimination is as follows:n";
    for (i = 0; i < n; i++)            //print the new matrix
    {
        for (j = 0; j <= n; j++)
            cout << p[i][j] << setw(16);
        cout << "n";
    }
    for (i = n - 1; i >= 0; i--)                
    {                        
        *x[i] = p[i][n];                
        for (j = i + 1; j < n; j++){
            if (j!= i) {
                x[i] = x[i] - int(( p[i][j] * (*x[j])));
                *x[i] *= (1 / p[i][i]);
            }               
                
        }
                             
    }
    cout << "nThe values of the variables are as follows:n";
    for (i = 0; i < n; i++) {
        cout << x[i] << endl;
    }
    delete[] p;
    delete[] x;
    return 0;

Код для решения СЛАУ методом Гаусса. Вроде как компилируется однако не дает финальные значения, относя все ошибки к изначальной матрице.
Она задана динамически и вроде как должно хватать памяти однако компилятор все равно жалуется.
В чем может быть вопрос?
Проблемный кусок кода

C++
1
2
3
4
5
6
7
cout << "nEnter the elements:n";
    for (i = 0; i < n; i++) {
        for (j = 0; j <= n; j++) {
            cin >> p[i][j];
        }
            
    }



0



687 / 393 / 201

Регистрация: 19.12.2016

Сообщений: 1,599

16.09.2020, 08:30

2

Цитата
Сообщение от Sunshine_1
Посмотреть сообщение

j <= n

Попробуйте удалить «=»



0



0 / 0 / 0

Регистрация: 16.09.2020

Сообщений: 3

16.09.2020, 08:42

 [ТС]

3

Тогда он не дает записать все переменные

Добавлено через 4 минуты
Скажем на примере 2 ЛАУ
Должно быть 6 переменных однако он обрывает после 4



0



ram876

687 / 393 / 201

Регистрация: 19.12.2016

Сообщений: 1,599

16.09.2020, 08:48

4

Я написал от балды простую программы и у меня все переменные проходит

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
#include <iostream>
 
using namespace std;
 
int main()
{
    int n = 5;
    int arr[n][n];
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < n; j++) 
        {
            arr[i][j] = 1;
        }
            
    }
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < n; j++) 
        {
            cout << arr[i][j];
        }
        cout << endl;
            
    }
 
    return 0;
}



0



0 / 0 / 0

Регистрация: 16.09.2020

Сообщений: 3

16.09.2020, 08:59

 [ТС]

5

Массив у вас статичный, n=5
Плюс у вас значение присваевается , а в моем случае значение вводятся пользователем



0



ram876

687 / 393 / 201

Регистрация: 19.12.2016

Сообщений: 1,599

16.09.2020, 09:27

6

Присвоение пользователем или перед компиляцией не имеет значение и не вижу проблем от динамического выделения
Вот:

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
#include <iostream>
 
using namespace std;
 
int main()
{
    int n, m;
    cout << "Enter n and mn";
    cin >> n >> m;
    int **arr = new int*[n];
    for ( int i = 0; i < n; i++) 
    {
        arr[i] = new int[m]; 
    }
    cout << "Enter numbersn";
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < m; j++) 
        {
            cin >> arr[i][j];
        }
            
    }
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < m; j++) 
        {
            cout << arr[i][j];
        }
        cout << endl;
            
    }
 
    return 0;
}



0



mathway

17 / 10 / 6

Регистрация: 15.09.2020

Сообщений: 39

16.09.2020, 09:46

7

Что значит вроде как компилируется? Можно узнать сообщение компилятора о результате компиляции?

Помимо всего прочего, в конце функции

C++
1
main()

вы удаляете лишь динамически выделенные массивы указателей, но не массивы, на которых они ссылаются. В данном примере это не имеет особого значения, ибо после выполнения программы все потребляемые ей ресурсы освобождаются для их дальнейшего использования другими программами,в том числе и выделенные динамически(в куче).



0



TheCalligrapher

Вездепух

Эксперт CЭксперт С++

10913 / 5909 / 1614

Регистрация: 18.10.2014

Сообщений: 14,851

16.09.2020, 09:56

8

Цитата
Сообщение от Sunshine_1
Посмотреть сообщение

Вроде как компилируется однако не дает финальные значения, относя все ошибки к изначальной матрице.
Она задана динамически и вроде как должно хватать памяти однако компилятор все равно жалуется.

Ничего не понял. «Вроде как компилируется» и «компилятор все равно жалуется» — это взаимоисключающие утверждения. Что это значит???

Цитата
Сообщение от Sunshine_1
Посмотреть сообщение

Проблемный кусок кода

C++
1
2
3
4
5
6
7
cout << "nEnter the elements:n";
    for (i = 0; i < n; i++) {
        for (j = 0; j <= n; j++) {
            cin >> p[i][j];
        }
            
    }

Почему вы решили, что это «проблемный кусок кода»? Я что-то не вижу тут никаких проблем.



0



687 / 393 / 201

Регистрация: 19.12.2016

Сообщений: 1,599

16.09.2020, 10:00

9

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

никаких проблем

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

j <= n

Разве тут не выход за пределы?



0



Вездепух

Эксперт CЭксперт С++

10913 / 5909 / 1614

Регистрация: 18.10.2014

Сообщений: 14,851

16.09.2020, 10:02

10

Цитата
Сообщение от ram876
Посмотреть сообщение

Разве тут не выход за пределы?

С чего бы это вдруг? Память выделена для прямоугольного массива размера [n][m], где m = n + 1. То есть по второму индексу можно итерировать до j < m или до j <= n (что то же самое).



1



687 / 393 / 201

Регистрация: 19.12.2016

Сообщений: 1,599

16.09.2020, 10:05

11

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

m = n + 1

не заметил, спасибо.



0



17 / 10 / 6

Регистрация: 15.09.2020

Сообщений: 39

16.09.2020, 10:37

12

Пожалуйста, предоставьте сообщение о компиляции этого исходника. Также укажите сам компилятор и его версию. И да, с чего вы решили, что проблема именно в прикреплённом вами куске кода?



0



0 / 0 / 0

Регистрация: 17.09.2020

Сообщений: 1

17.09.2020, 05:54

13

Извиняюсь, почта была утеряна

Компилирует- в том смысле что проходит сборка и он выдает адекватные числа в матрице значений однако ответ выдает неверный
Выдает ошибку- в том смысле что по итогу ответ вообще не тот и в исходнике кода до компиляции он показывает на этот момент как «возможная ошибка», что не мешает ему провести сборку

Добавлено через 6 минут
На это указывает компилятор
Есть далее похожий кусок кода который показывается точно так же

Я пишу на VS 2019 (предположу что последней версии ибо устанавливал недавно).
Ошибка C6385 » «Чтение недопустимых данных из p[i] Доступный обьем для чтения равен «m*8» байт однако считать можно только «16» байт»



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

17.09.2020, 05:54

Помогаю со студенческими работами здесь

Выводит ошибку на строке StudentA student = new Student («Динар», «19», «Е09-31»);В чем причина?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

Ругается на строку Student student = new Student («Динар», «19», «Е09-31»); В чём причина?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

Построить функцию которая возвращает текст «not defined»(«Не определено») при недопустимых значениях х
Ребят вот вопрос возник с такой задачкой..
Для того чтобы вычислить значение выражения(его скрин я…

Написать программу проверки правильности написания сочетаний «жи», «ши», «ча», «ща», «чу», «щу». Исправить ошибки
дан текст.написать программу проверки правильности написания сочетаний &quot;жи&quot;, &quot;ши&quot;, &quot;ча&quot;, &quot;ща&quot;,…

Причина ошибки «Unable to write data to the transport connection»
private void Write(string Message)
{
//используется для перекодирования даных…

Setlocale(LC_CTYPE,»Russian») -причина ошибки printf ?
Работаю на билдере давно. Но до такого маразма не доходил.
Оператор setlocale(LC_CTYPE,&quot;Russian&quot;) …

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

Или воспользуйтесь поиском по форуму:

13

I seem to get an erroneous warning message from Visual Studio 2019 (16.5 Preview but also in 16.4 and earlier) Code Analysis tool. Is this a bug, or am I really just missing something?

The warning generated (exactly) is:

warning C6385: Reading invalid data from ‘prodlist’: the readable size is ‘(size_t)*32+8′ bytes, but ’64’ bytes may be read.

Here’s the code which generates the warning (as minimal as possible)

#include <cstdint>
#include <string>
#include <iostream>

struct Product {
    std::string price_profile;
};

int getNumRows() {
    return 5;
}

Product *getProductsFromDB( int &numelements ) {
    numelements = 0;

    const int num_rows = getNumRows();
    if ( num_rows == 0 ) {
        numelements = 0;
        return nullptr;
    }

    Product *prodlist = new Product[num_rows];
    for ( int i = 0; i < num_rows; ++i ) {
        prodlist[i].price_profile = "test"; // Warning on this line
    }
    numelements = num_rows;

    return prodlist;
}

int main() {
    int num_rows;
    Product *prodlist = getProductsFromDB( num_rows );
    for ( int i = 0; i < num_rows; ++i ) {
        std::cout << prodlist[i].price_profile;
    }

    getchar();
}

If I change the price_profile to an int (and its corresponding value), or if I change num_rows to a constant (like 5) then the warning goes away.

asked Jan 8, 2020 at 16:04

ChrisMM's user avatar

ChrisMMChrisMM

8,44013 gold badges29 silver badges48 bronze badges

3

It seems in Visual Studio 2019 Microsoft is enforcing SAL analysis rules on C and C++ code by default, even though there are still plenty of false positives like your case here.

One thing you can do for now is disable the warning giving a false positive:

#pragma warning(push)
#pragma warning(disable:6385)
Product *getProductsFromDB( int &numelements ) {
 ...
}
#pragma warning(pop)

answered Jan 8, 2020 at 16:26

Govind Parmar's user avatar

Govind ParmarGovind Parmar

20.5k7 gold badges53 silver badges85 bronze badges

3

I get this warning if I try to use function geti() in the following code.

Warning C6385   Reading invalid data from 'snapPts':  the readable size is '((geti()+1))*sizeof(DPoint3d)' bytes, but '48' bytes may be read.

But If I use integer like

int i

directly then I am not able to get the warning. I am unable to understand the scenario that what’s happening there, I googled it much but couldn’t find the solution. I am new to c++, please pardon me for spell mistake and please help me to understand this.

Note: I am building the code with «Microsoft Mixed(C++/CLR) Recommended Rules.

I am using the following code

#include <windows.h>  
#include <stdio.h>  
#include <malloc.h>
#include <corecrt_wstring.h>

int geti() {
return 2;
}
struct  DPoint3d
{
//! x coordinate
double x;
//! y coordinate
double y;
//! z coordinate
double z;
};

int main(array<System::String ^> ^args)
{

int i = 2;


if (i > 1) {

    DPoint3d*   snapPts = (DPoint3d *)_alloca((geti() + 1) * sizeof(DPoint3d));

    DPoint3d* snapPts2 = new DPoint3d();

    *snapPts2 = snapPts[1];


}

return 0;
}

A great answer is really appreciated.

Thanks

Permalink

Cannot retrieve contributors at this time

title description ms.date f1_keywords helpviewer_keywords ms.assetid

Warning C6385

Describes C++ Code Analysis warning C6385 and how to resolve it.

03/16/2020

C6385

READ_OVERRUN

__WARNING_READ_OVERRUN

C6385

3e4961e7-0f09-42a8-8cc2-151109dfdbda

Warning C6385

Invalid data: accessing buffer-name, the readable size is size1 bytes, but size2 bytes may be read: Lines: x, y

Remarks

The readable extent of the buffer might be smaller than the index used to read from it. Attempts to read data outside the valid range leads to buffer overrun.

Code analysis name: READ_OVERRUN

Example

The following code generates this warning:

void f(unsigned int i)
{
   char a[20];
   char j;
   if (i <= 20)  // C6385
   {
      j = a[i];
   }
}

To correct this warning, use the following code:

void f(unsigned int i)
{
   char a[20];
   char j;
   if (i < 20)  // Okay
   {
      j = a[i];
   }
}

See also

Avoiding buffer overruns

Я пишу код для поиска простых чисел решетом Сундарама. Использовал Динамический массив. Из-за него и проблема, я считаю:

#include <iostream>
#include <chrono>
using namespace std;
// Вывод всех простых чисел до 2n решетом Сундарама.
int main()
{
    setlocale(LC_ALL, "Russian");
    int n;

    cout << "Введите число n:" << endl;
    cin >> n;

    bool* nums = new bool[n + 1]; // Объявление динамического массива.
    
    for (int i = 1; i <= n+1; i++)
        nums[i] = true; // <-- Переполнение буфера при записи в "nums": 
                        // доступный для записи объём равен "(n+1)*1" байт, однако записать можно 
                        // только "3" байт.

    int limit = (pow(2 * n + 1, 0.5) - 1) / 2;

    auto start = chrono::high_resolution_clock::now();

    for (int i = 1; i < limit; i++)
    {
        for (int j = i; j < (n - i)/(2 * i + 1); j++)
        {
            nums[2 * i * j + i + j] = false;
        }
    }

    for (int m = 1; m <= n + 1; m++)
    {
        if (nums[m]) cout << 2 * m + 1 << endl; // <-- Чтение недопустимых данных из "nums": 
                                               // доступный для чтения объём равен "(n+1)*1" байт, 
                                               // однако считать можно только "3" байт.
    }

    auto end = chrono::high_resolution_clock::now();

    chrono::duration<float> duration = end - start;
    cout << "Длительность выполнения алгоритма: " << duration.count() << " секунд." << endl;

    delete[]nums;
    nums = NULL;
}

Также просто подсчитываю время его выполнения.

В конце выполнения программы вылезает ошибка:

Debug Error!
<...>
HEAP CORRUPTION DETECTED: after Normal block (#764) at
0x008655A0.
CRT detected that the application wrote to memory after end of heap buffer.

Как понимать эти два предупреждения и Debug Error?

Понравилась статья? Поделить с друзьями:
  • Ошибка c6230 kyocera m2040dn
  • Ошибка c6200 kyocera 2540
  • Ошибка c6020 kyocera как исправить
  • Ошибка c6020 kyocera 2040
  • Ошибка c6000 kyocera 2535dn