বাসের ত্রুটি কী?


254

"বাস ত্রুটি" বার্তাটি কী বোঝায় এবং এটি কীভাবে সেগফল্ট থেকে পৃথক হয়?


5
আমি উভয়ের জন্য একটি সহজ ব্যাখ্যা যুক্ত করতে চাই: বিভাজন ত্রুটির অর্থ হল যে আপনি মেমরিটি অ্যাক্সেস করার চেষ্টা করছেন যা আপনাকে অনুমোদিত নয় (যেমন এটি আপনার প্রোগ্রামের অংশ নয়)। যাইহোক, একটি বাস ত্রুটিতে এটির অর্থ সাধারণত আপনি মেমরি অ্যাক্সেস করার চেষ্টা করছেন যা অস্তিত্বহীন নয় (যেমন আপনি 12 জি তে একটি ঠিকানা অ্যাক্সেস করার চেষ্টা করছেন তবে আপনার কাছে কেবল 8 জি মেমরি রয়েছে) বা আপনি যদি ব্যবহারযোগ্য মেমরির সীমা অতিক্রম করেন তবে।
xdevs23

কোন প্ল্যাটফর্মে আপনি এটি দেখেছেন? পিসি? ম্যাক? এক্স 86? 32/64?
পিটার মর্টেনসেন

উত্তর:


243

আজকাল x86 এ বাস ত্রুটি বিরল এবং যখন প্রসেসর এমনকি অনুরোধ করা মেমরি অ্যাক্সেস চেষ্টা করতে না পারে তখনই ঘটে:

  • এমন কোনও প্রসেসরের নির্দেশ ব্যবহার করে যা এর প্রান্তিককরণের প্রয়োজনীয়তা পূরণ করে না।

মেমরি অ্যাক্সেস করার সময় বিভাজন ত্রুটি ঘটে যা যা আপনার প্রক্রিয়াভুক্ত নয়, সেগুলি খুব সাধারণ এবং সাধারণত এর ফলাফল:

  • কিছু হ্রাস করা হয়েছে যা একটি পয়েন্টার ব্যবহার।
  • একটি বিরতিহীন তাই বগাস পয়েন্টার ব্যবহার।
  • একটি নাল পয়েন্টার ব্যবহার করে।
  • উপচে পড়া একটি বাফার

পিএস: আরও সুনির্দিষ্টভাবে বলতে গেলে এটি পয়েন্টারটি নিজেই চালিত করে না যা সমস্যার কারণ হয়ে দাঁড়ায়, এটি মেমরিটিকে নির্দেশ করে যা এটি (ডিসিফারেন্সিং) নির্দেশ করে।


105
এগুলি বিরল নয়; আমি হার্ড ওয়ে সি থেকে কীভাবে অনুশীলন 9 এ আছি এবং ইতিমধ্যে এর মুখোমুখি হয়েছি ...
11684

24
বাস ত্রুটির অন্য কারণ (যাইহোক লিনাক্সে) হ'ল অপারেটিং সিস্টেমটি যখন ভার্চুয়াল পৃষ্ঠাকে শারীরিক মেমরির সাহায্যে ব্যাক করতে না পারে (উদাহরণস্বরূপ স্বল্প স্মৃতি শর্তাবলী বা বিশাল পৃষ্ঠাগুলির বাইরে বিশাল পৃষ্ঠাগুলি ব্যবহার করা হয় না)) সাধারণত এমএম্যাপ (এবং ম্যালোক) কেবল ভার্চুয়াল ঠিকানার স্থান সংরক্ষণ করুন, এবং কার্নেল শারীরিক মেমরির চাহিদা অনুসারে বরাদ্দ করে (যাকে নরম পৃষ্ঠার ত্রুটি বলা হয়)) যথেষ্ট পরিমাণে ম্যালোক তৈরি করুন, এবং তারপরে যথেষ্ট লিখুন এবং আপনি একটি বাস ত্রুটি পাবেন।
ইলফ

1
আমার জন্য থাকা পার্টিশনটি /var/cacheকেবল সম্পূর্ণ জিজ্ঞাসুবন্টু.com
a/

2
আমার ক্ষেত্রে, একটি পদ্ধতি একটি বস্তুর static_castএকটি void *প্যারামিটার সম্পাদনা করে যা একটি কলব্যাক সঞ্চয় করে (একটি বৈশিষ্ট্যটি বস্তুর দিকে নির্দেশ করে এবং অন্যটি পদ্ধতিতে)। তারপরে কলব্যাক বলা হয়। তবে, যা পাস করা void *হয়েছিল তা সম্পূর্ণ আলাদা কিছু ছিল এবং এইভাবে পদ্ধতি কলটি বাসের ত্রুটির কারণ হয়েছিল।
ক্রিস্টোফার কে।

@bltxd আপনি কি বাসের ত্রুটির প্রকৃতি জানেন? অর্থাত্ রিং বাসে থাকা বার্তায় কী এমন কোনও ব্যবস্থা আছে যেখানে রিংয়ের স্টপটি কোনও বার্তা গ্রহণ করে যা এটি প্রেরণ করে তবে যে কোনও গন্তব্যস্থলে এটি প্রস্তাব দেয় যে এটি রিংয়ের চারদিকে চলে গেছে এবং গ্রহণযোগ্য হয়নি। আমি অনুমান করছি লাইন ফিল বাফারটি একটি ত্রুটি স্থিতি প্রদান করে এবং যখন এটি অবসর গ্রহণ করে তখন এটি পাইপলাইনটি ফ্লাশ করে এবং সঠিক ব্যতিক্রমকে মাইক্রোআরটিন বলে। এর জন্য মূলত প্রয়োজন হয় যে মেমরি নিয়ামক তার পরিসরের সমস্ত ঠিকানা স্বীকার করে দেয় যা বোঝায় যে বারগুলি ইত্যাদির পরিবর্তিত হলে এটি অভ্যন্তরীণভাবে করতে হবে
লুইস কেলসি

84

একটি সেগফল্ট মেমরি অ্যাক্সেস করছে যা আপনাকে অ্যাক্সেস করার অনুমতি নেই। এটি কেবল পঠনযোগ্য, আপনার অনুমতি নেই ইত্যাদি ইত্যাদি ...

একটি বাস ত্রুটি মেমরি অ্যাক্সেস করার চেষ্টা করছে যা সম্ভবত সেখানে থাকতে পারে না। আপনি এমন কোনও ঠিকানা ব্যবহার করেছেন যা সিস্টেমের কাছে অর্থহীন নয় বা সেই অপারেশনের জন্য ভুল ধরণের ঠিকানা।


14

mmap ন্যূনতম পসিক্স 7 উদাহরণ

"বাস ত্রুটি" ঘটে যখন কার্নেল SIGBUSকোনও প্রক্রিয়াতে প্রেরণ করে।

একটি ন্যূনতম উদাহরণ যা এটি উত্পাদন করে কারণ ftruncateভুলে গিয়েছিল:

#include <fcntl.h> /* O_ constants */
#include <unistd.h> /* ftruncate */
#include <sys/mman.h> /* mmap */

int main() {
    int fd;
    int *map;
    int size = sizeof(int);
    char *name = "/a";

    shm_unlink(name);
    fd = shm_open(name, O_RDWR | O_CREAT, (mode_t)0600);
    /* THIS is the cause of the problem. */
    /*ftruncate(fd, size);*/
    map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    /* This is what generates the SIGBUS. */
    *map = 0;
}

সাথে চালান:

gcc -std=c99 main.c -lrt
./a.out

উবুন্টু 14.04 এ পরীক্ষিত।

পসিক্স বর্ণনা SIGBUS করে:

মেমরি অবজেক্টের একটি অপরিজ্ঞাত অংশে অ্যাক্সেস।

Mmap বৈশিষ্ট যে বলেন:

অ্যাড্রেস রেঞ্জের মধ্যে রেফারেন্সগুলি Pa থেকে শুরু হবে এবং অবজেক্টের শেষের পরে পুরো পৃষ্ঠায় লেন বাইটের জন্য চালিয়ে যাওয়ার ফলে একটি সাইনবাস সিগন্যাল সরবরাহ করা হবে।

এবং shm_open বলে যে এটি 0 আকারের অবজেক্ট তৈরি করে:

ভাগ করা মেমরি অবজেক্টটির আকার শূন্য has

সুতরাং *map = 0আমরা বরাদ্দ করা অবজেক্টের শেষটি ছুঁয়ে যাচ্ছি।

স্বাক্ষরবিহীন স্ট্যাক মেমরি এআরএমভি 8 আর্চ 64 এ অ্যাক্সেস করে

এটি উল্লেখ করা হয়েছিল: একটি বাস ত্রুটি কি? স্পার্কের জন্য, তবে এখানে আমি আরও পুনরুত্পাদনযোগ্য উদাহরণ সরবরাহ করব।

আপনার যা দরকার তা হ'ল একটি নিরস্তর পরিবেশক arch৪ প্রোগ্রাম:

.global _start
_start:
asm_main_after_prologue:
    /* misalign the stack out of 16-bit boundary */
    add sp, sp, #-4
    /* access the stack */
    ldr w0, [sp]

    /* exit syscall in case SIGBUS does not happen */
    mov x0, 0
    mov x8, 93
    svc 0

সেই প্রোগ্রামটি তখন একটি থান্ডারএক্স 2 সার্ভার মেশিনে উবুন্টু 18.04 আর্চ 64, লিনাক্স কার্নেল 4.15.0 এ সিগবস উত্থাপন করে ।

দুর্ভাগ্যক্রমে, আমি এটিকে QEMU v4.0.0 ব্যবহারকারী মোডে পুনরুত্পাদন করতে পারি না, কেন তা আমি নিশ্চিত নই।

ফল্টটি fieldsচ্ছিক SCTLR_ELx.SAএবং SCTLR_EL1.SA0ক্ষেত্রগুলি দ্বারা নিয়ন্ত্রিত বলে মনে হয় , আমি এখানে সম্পর্কিত ডকসগুলি আরও কিছুটা সংক্ষেপে জানিয়েছি ।


11

আমি বিশ্বাস করি যখন কোনও অ্যাপ্লিকেশন ডেটা বাসে ডেটা বিভ্রান্তি প্রদর্শন করে তখন কার্নেল সিগবূসকে উত্থাপন করে। আমি মনে করি যেহেতু বেশিরভাগ প্রসেসরের জন্য আধুনিক সংকলকগণ প্রোগ্রামারগুলির জন্য প্যাড / তথ্য প্রান্তিককরণ করছেন, ইয়ারের প্রান্তিককরণের সমস্যাগুলি (কমপক্ষে) প্রশমিত করা হয়েছে, এবং তাই আজকের দিনে সিগাবাস খুব বেশি দেখা যায় না (এএফআইকে)।

থেকে: এখানে


1
আপনি আপনার কোড দিয়ে করছেন এমন বাজে কৌশলগুলিতে নির্ভর করে। আপনি যদি কোনও সমস্যা মোডে অ্যাক্সেসের জন্য টাইপকাস্টের মতো নির্বোধ কিছু করেন এবং তারপরে কোনও সমস্যা মোডে অ্যাক্সেসের জন্য টাইপকাস্ট করেন তবে আপনি বুসের ত্রুটি / প্রান্তিককরণ ট্র্যাপটি ট্রিগার করতে পারেন (যেমন আপনি একটি uint8_t অ্যারে সেট আপ করেছেন, অ্যারের পয়েন্টারটিতে একটি, দুটি, বা তিনটি যোগ করুন এবং তারপরে টাইপকাস্ট করুন) একটি সংক্ষিপ্ত, ইনট বা দীর্ঘ এবং আপত্তিকর ফলাফলটি অ্যাক্সেস করার চেষ্টা করুন)) এক্স 86 সিস্টেমগুলি আপনাকে বাস্তবিক পারফরম্যান্সের দণ্ডে সত্ত্বেও এটি করতে দেয়। কয়েকটি এআরএমভি 7 সিস্টেম আপনাকে এটি করতে দেবে- তবে বেশিরভাগ এআরএম, এমআইপিএস, বিদ্যুৎ ইত্যাদির মাধ্যমে এটি আপনার কাছে গ্রিস করবে।
স্বয়ার্টাল্ফ

6

কোনও কারণে যখন কোনও পৃষ্ঠা পৃষ্ঠাতে প্রবেশ করা যায় না তখন আপনি সিগবাসও পেতে পারেন।


7
প্রক্রিয়াটি চালানোর সময় আমি যখন .so ফাইল আপডেট করি তখন প্রায়শই এটি ঘটে
poordeveloper

হওয়ার আরেকটি কারণ হ'ল আপনি যদি mmapআকারের চেয়ে বড় কোনও ফাইলের চেষ্টা করেন/dev/shm
ilaja139

3

ওএস এক্স-তে সি প্রোগ্রামিং করার সময় একটি বাস ত্রুটির একটি নির্দিষ্ট উদাহরণ:

#include <string.h>
#include <stdio.h>

int main(void)
{
    char buffer[120];
    fgets(buffer, sizeof buffer, stdin);
    strcat("foo", buffer);
    return 0;
}

আপনি যদি মনে করেন না ডক্স strcatপ্রথম যুক্তিটি পরিবর্তন করে প্রথম যুক্তিতে দ্বিতীয় যুক্তিকে সংযোজন করে (আর্গুমেন্টগুলি ফ্লিপ করুন এবং এটি সূক্ষ্মভাবে কাজ করে)। লিনাক্সে এটি একটি সেগমেন্টেশন ত্রুটি দেয় (যেমনটি প্রত্যাশিত) তবে ওএস এক্সে এটি একটি বাস ত্রুটি দেয়। কেন? আমি সত্যিই জানি না।


সম্ভবত স্ট্যাক ওভারফ্লো সুরক্ষা বাস ত্রুটি উত্থাপন করে।
জোশুয়া

1
"foo"কেবল মেমরির পঠনযোগ্য বিভাগে এটি সঞ্চয় করা আছে, তাই এটিতে লেখা অসম্ভব। এটি স্ট্যাক ওভারফ্লো সুরক্ষা হবে না, কেবল মেমরি লেখার সুরক্ষা (এটি যদি আপনার প্রোগ্রাম নিজেই আবার লিখতে পারে তবে এটি একটি সুরক্ষা গর্ত)।
লাকাতা

3

বাসের ত্রুটির একটি ক্লাসিক উদাহরণ নির্দিষ্ট আর্কিটেকচারগুলিতে যেমন: স্পার্ক (কমপক্ষে কিছু এসপিআরসি, সম্ভবত এটি পরিবর্তিত হয়েছে) হয়, যখন আপনি কোনও ভুল-প্রান্তিকৃত অ্যাক্সেস করেন। এই ক্ষেত্রে:

unsigned char data[6];
(unsigned int *) (data + 2) = 0xdeadf00d;

এই স্নিপেটটি 32-বিট পূর্ণসংখ্যার মানটি 0xdeadf00dএমন ঠিকানায় লেখার চেষ্টা করে যা সম্ভবত (সঠিকভাবে প্রান্তিক নয়), এবং আর্কিটেকচারের ক্ষেত্রে "ত্রুটিযুক্ত" বাসে একটি ত্রুটি তৈরি করবে। ইন্টেল এক্স 86 উপায় দ্বারা, হয় না যেমন একটি স্থাপত্য, এটা অ্যাক্সেস (যদিও এটা আরো ধীরে ধীরে চালানো) সম্ভব হবে।


1
সেক্ষেত্রে আমার কাছে ডেটা ছিল [8]; এটি 32-বিট আর্কিটেকচারে এখন 4 এর একাধিক। সুতরাং, এটি প্রান্তিক করা হয়। আমি এখনও ত্রুটি পেতে হবে? এছাড়াও, দয়া করে ব্যাখ্যা করুন, এটি পয়েন্টারগুলির জন্য কোনও ডেটা ধরণের রূপান্তরটির পক্ষে খারাপ ধারণা। এটি কি ভঙ্গুর আর্কিটেকচারে ভুল-প্রান্তিককরণের ত্রুটি ঘটায়? দয়া করে বিস্তারিত বলুন, এটি আমাকে সাহায্য করবে।
পারক

হেহ। আপনি যে পয়েন্টারে যে পয়েন্টার ম্যাথ চালু করেছেন তাতে টাইপ রূপান্তর করছেন এমনটি রূপান্তর নয়। উপরের কোডটি সাবধানতার সাথে দেখুন Look সংকলকটি সাবধানতার সাথে আপনার পয়েন্টারটি ডেটা-র জন্য সারিবদ্ধভাবে রেখেছে- এবং তারপরে আপনি দু'টি দ্বারা রেফারেন্সটি অফসেট করে এবং ডাইফার বিন্যাসের অ্যাক্সেসের খুব দরকার যা টাইপকেস্ট করে একটি নন-ডাউড সীমানা হতে চলেছে সংকলকটিতে সমস্ত কিছু স্ক্রু আপ করে।
সোভার্টাল্ফ

"ফ্রেগাইল" শব্দটি আমি এই সকলের জন্য ব্যবহার করব না। এক্স 86 মেশিন এবং কোড লোকদের আপাতত কিছু সময়ের জন্য নির্বোধ কাজ করতে পেয়েছে, এটি তাদের অন্যতম। আপনার কোডটি পুনর্বিবেচনা করুন যদি আপনার এই ধরণের সমস্যা হয় - এটি X86 এর সাথে শুরু করা খুব পারফর্মেন্ট নয়।
স্বয়ার্টাল্ফ

@ সোয়ার্টাল্ফ: x86-তে, স্বাক্ষরযুক্ত পয়েন্টারে শব্দের অ্যাক্সেসগুলি প্রান্তিক পয়েন্টারগুলিতে শব্দের অ্যাক্সেসের চেয়ে অবশ্যই ধীর গতিতে, তবে কমপক্ষে historতিহাসিকভাবে এগুলি সহজ কোডের চেয়ে দ্রুততর ছিল যা নিঃশর্তভাবে বাইটগুলির বাইরে জিনিসগুলিকে একত্রিত করে এবং এগুলি কোডের চেয়ে অবশ্যই সহজতর হয় যা চেষ্টা করে বিভিন্ন আকারের ক্রিয়াকলাপগুলির সর্বোত্তম সংমিশ্রণটি ব্যবহার করতে। আমি আশা করি সি স্ট্যান্ডার্ডটি বৃহত্তর পূর্ণসংখ্যার ধরণগুলি প্যাকিং / আনপ্যাকিংয়ের মাধ্যমকে ছোট ছোট পূর্ণসংখ্যার / অক্ষরগুলির ক্রম / থেকে অন্তর্ভুক্ত করবে যাতে প্রদত্ত প্ল্যাটফর্মে যেকোন পদ্ধতির সর্বোত্তম উপায় সংকলকটি ব্যবহার করতে দেয়।
সুপারক্যাট

@ সুপের্যাট: জিনিসটি হ'ল আপনি এটি এক্স ৮86-এর সাথে সরে যাবেন। আপনি এটি এআরএম, এমআইপিএস, বিদ্যুৎ ইত্যাদিতে চেষ্টা করে দেখেন এবং আপনার সাথে খারাপ বিষয়গুলি ঘটতে চলেছে। আর্চ ভি than এর চেয়ে কম এআরএম এ, আপনার কোডটির একটি প্রান্তিককরণ ব্যর্থতা থাকবে- এবং ভি on-তে আপনি করতে পারেন, যদি আপনার রানটাইম সেট করা থাকে তবে এটি একটি আলাদা পারফরম্যান্স হিট দিয়ে পরিচালনা করুন। আপনি কেবল এটি করতে চান না। এটা খারাপ অভ্যাস, ভোঁতা হতে। : ডি
স্বার্থলফ

2

এটি আপনার ওএস, সিপিইউ, সংকলক এবং সম্ভবত অন্যান্য কারণের উপর নির্ভর করে।

সাধারণভাবে এর অর্থ সিপিইউ বাস কোনও কমান্ড শেষ করতে পারেনি, বা দ্বন্দ্বের মুখোমুখি হয়েছে, তবে এর অর্থ পরিবেশ এবং কোড চালিত হওয়ার উপর নির্ভর করে সামগ্রিক পরিসরের পরিমাণ থাকতে পারে।

-Adam


2

এর অর্থ সাধারণত অ-অ্যালাইন্টেড অ্যাক্সেস।

শারীরিকভাবে উপস্থিত না থাকা মেমোরির অ্যাক্সেসের একটি প্রচেষ্টাও একটি বাস ত্রুটি দিতে পারে তবে আপনি এটি দেখতে পাবেন না যদি আপনি কোনও এমএমইউ এবং একটি বাগি নেই এমন একটি প্রসেসর ব্যবহার করছেন, কারণ আপনার কোনও অকার্যকর হবে না আপনার প্রক্রিয়া ঠিকানা স্থানে মেমরি মেশানো।


2
আমার আই 7 এর অবশ্যই একটি এমএমইউ রয়েছে, তবে ওএস এক্স-এ সি শিখার সময় আমি এই ত্রুটিটি পেরিয়ে এসেছি (অবিচ্ছিন্ন পয়েন্টারটি এতে প্রেরণ করছি scanf)। এর অর্থ কি ওএস এক্স মাভারিক্স বগি? নন-বগি ওএসের আচরণটি কী হত?
ক্যালভিন হুয়াং

2

রুট ডিরেক্টরিটি 100% এ থাকা অবস্থায় আমি একটি বাস ত্রুটি পেয়েছিলাম।


1

ম্যাক ওএস এক্সে আমার বাসের ত্রুটির কারণ হ'ল আমি স্ট্যাকটিতে প্রায় 1 এমবি বরাদ্দ করার চেষ্টা করেছি। এটি একটি থ্রেডে ভাল কাজ করেছে, তবে ওপেনএমপি ব্যবহারের সময় এই ড্রাইভগুলি বাসের ত্রুটিতে চলেছে, কারণ ম্যাক ওএস এক্সের অ-প্রধান থ্রেডগুলির জন্য খুব সীমিত স্ট্যাক আকার রয়েছে


1

আমি উপরের সমস্ত উত্তর সাথে একমত। এখানে বিএস ত্রুটি সম্পর্কিত আমার 2 সেন্ট রয়েছে:

প্রোগ্রামের কোডের মধ্যে থাকা নির্দেশাবলী থেকে কোনও বিএস ত্রুটি উদয় হওয়ার দরকার নেই। এটি ঘটতে পারে যখন আপনি বাইনারি চালাচ্ছেন এবং এক্সিকিউশন চলাকালীন সময়ে বাইনারিটি সংশোধন করা হয় (বিল্ড দ্বারা মুছে ফেলা বা মোছা ইত্যাদি)।

এটি ক্ষেত্রে কিনা তা যাচাই করা হচ্ছে: এটি কারণ কিনা তা যাচাই করার একটি সহজ উপায় হ'ল একই বাইনারিটির চলমান দৃষ্টান্তগুলি চালু করে একটি বিল্ড চালানো। SIGBUSবিল্ডিং শেষ হয়ে যাওয়ার পরে এবং বাইনারি প্রতিস্থাপনের (উভয় দৃষ্টান্তই বর্তমানে চলছে এমন একটি) দু'টি চলমান দৃষ্টান্তই ত্রুটির সাথে ক্রাশ হবে both

অন্তর্নিহিত কারণ: এটি কারণ মেমরি পৃষ্ঠাগুলি অদলবদল করে এবং কিছু ক্ষেত্রে বাইনারি পুরোপুরি মেমরিতে লোড না হতে পারে এবং ওএস একই বাইনারি থেকে পরবর্তী পৃষ্ঠাটি আনার চেষ্টা করলে এই ক্র্যাশগুলি ঘটতে পারে তবে বাইনারিটি শেষ হওয়ার পর থেকে পরিবর্তিত হয়েছে এটি পড়ুন।


সম্মত, এটি আমার অভিজ্ঞতার মধ্যে বাসের ত্রুটির সর্বাধিক সাধারণ কারণ।
itaych

0

উপরে blxtd জবাব দিয়েছিল তা যুক্ত করতে, আপনার প্রক্রিয়া কোনও নির্দিষ্ট 'ভেরিয়েবল' এর মেমোরি অ্যাক্সেস করতে না পারলে বাস ত্রুটিগুলিও ঘটে ।

for (j = 0; i < n; j++) {
    for (i =0; i < m; i++) {
        a[n+1][j] += a[i][j];
    }
}

লক্ষ্য করুন ' অসাবধানী এর ব্যবহার দেখে ' আমি 'পরিবর্তনশীল মধ্যে ' লুপ জন্য 'প্রথম? এই ক্ষেত্রে বাসের ত্রুটি ঘটছে।


যদি মি> = এন হয় তবে বহিরাগত লুপটি একবারের প্রয়োগ করা হবে বা একেবারে নয়, i এর পূর্বনির্ধারিত মানের উপর নির্ভর করে। যদি এম <এন হয় তবে এটি জে সূচক বৃদ্ধির সাথে অনির্দিষ্টকালের জন্য চলবে, যতক্ষণ না আপনি আপনার অ্যারের সীমা ছাড়িয়ে যান এবং সম্ভবত বিভাজন নয়, কোনও ত্রুটি ঘটায় bus যদি এই কোডটি সংকলিত হয় তবে নিজেই 'আই' ভেরিয়েবলের মেমরি অ্যাক্সেস করতে কোনও সমস্যা নেই। দুঃখিত তবে এই উত্তরটি ভুল।
itaych

0

আমি কেবল শক্ত উপায়টি খুঁজে পেয়েছি যে কোনও এআরএমভি 7 প্রসেসরে আপনি এমন কিছু কোড লিখতে পারেন যা আপনাকে অপরিশোধিত করার সময় একটি সেগমেন্টেশন ত্রুটি দেয় তবে -O2 (আরও অনুকূলিতকরণ) সংকলন করার সময় এটি আপনাকে একটি বাস ত্রুটি দেয়।

আমি উবুন্টু bit৪ বিট থেকে জিসিসি এআরএম জেনুয়েবিহফ ক্রস সংকলক ব্যবহার করছি।


কিভাবে এই প্রশ্নের উত্তর দেয়?
পিটার মর্টেনসেন

-1

একটি সাধারণ বাফার ওভারফ্লো যা বাসের ত্রুটির ফলস্বরূপ,

{
    char buf[255];
    sprintf(buf,"%s:%s\n", ifname, message);
}

এখানে যদি ডাবল উদ্ধৃতিতে ("") স্ট্রিংয়ের আকার বুফ আকারের চেয়ে বেশি হয় তবে এটি বাসের ত্রুটি দেয়।


1
হিহ ... যদি এটি হয়ে থাকে তবে উইন্ডোজ এবং অন্যান্য মেশিনগুলির জন্য আপনি সর্বদা পড়া স্ট্যাকের বিপর্যয়কর শোষণের পরিবর্তে বুসের ত্রুটি সম্পর্কিত উদ্বেগ বোধ করবেন। "মেমরি" অ্যাক্সেস করার চেষ্টার কারণে বিএস ত্রুটিগুলি ঘটেছিল যা ঠিকানাটি অবৈধ হওয়ার কারণে যন্ত্রটি কেবল অ্যাক্সেস করতে পারে না। (অতএব "BUS" ত্রুটি শব্দটি)) এটি অবৈধ প্রান্তিককরণগুলি সহ অনেকগুলি ব্যর্থতার কারণে হতে পারে, এবং প্রসেসরটি বাস লাইনে ঠিকানাটি রাখতে না পারে ততক্ষণ।
সোভার্টাল্ফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.