Я пытаюсь очень трудно получить ошибку шины.
Одним путем является неправильно выровненный доступ, и я попробовал примеры, данные здесь и здесь, но никакая ошибка для меня - программы не выполняется очень хорошо.
Есть ли некоторая ситуация, которая, несомненно, произведет ошибку шины?
Являются ли свойства X и Y (а не поля)? Если да, то это проблема. До тех пор, пока все поля в пределах x
не будут точно назначены, нельзя вызывать какие-либо методы или свойства.
Например:
public struct Foo
{
public int x;
public int X { get { return x; } set { x = value; } }
}
class Program
{
static void Main(string[] args)
{
Foo a;
a.x = 10; // Valid
Foo b;
b.X = 10; // Invalid
}
}
Является ли Vec2
вашим собственным типом? У вас есть доступ к соответствующим полям или только к свойствам?
Если это ваш тип, я бы настоятельно призвал вас попытаться придерживаться неизменяемых структур. Я знаю, что управляемый DirectX имеет несколько изменяемых структур для максимально приближенной к оптимальной производительности, но это ценой странных ситуаций, таких как эта - и гораздо хуже, если честно.
Я бы лично дал структуре конструктор, принимающий X и Y:
Vec2 x = new Vec2(det * (a22 * b.X - a12 * b.Y),
det * (a11 * b.Y - a21 * b.X));
-121--2147997- Он все еще не инициализирован. Перед использованием его необходимо инициализировать. Для этого можно использовать оператор default
, если вы не хотите создавать статическое значение Vec.Empty
и довольны значениями по умолчанию для членов структуры:
Vec2 x = default(Vec2);
Mitch Пшеница:
Это, однако, не означает:
public struct Vec2
{
int x;
int y;
public float X { get { return x; } set { x = value; } }
public float Y { get { return y; } set { y = value; } }
}
static void Main(string[] args)
{
Vec2 x;
x.X = 1;
x.Y = 2;
}
Компилятор запрещает вызывать propertis для типов до того, как все члены структуры будут инициализированы, даже если свойство может просто Решение, как предложил Джон Скит, состоит в том, чтобы иметь инициализирующий конструктор и предпочтительно не иметь установщиков.
-121--2147999-Ошибки шины могут быть вызваны только на аппаратных платформах, которые:
Вероятно, у вас нет доступа к такой системе.
Просто, запишите в память, которая не ваша:
int main()
{
char *bus_error = 0;
*bus_error = 'X';
}
ошибка мгновенной шины на моем PowerPC Mac [OS X 10.4, двойной 1 ГГц PPC7455], не обязательно на вашей аппаратной и / или операционной системе.
Там даже артикудия википедия о ошибках шины, включая программу, чтобы сделать один.
Как насчет это? непроверенный.
#include<stdio.h>
typedef struct
{
int a;
int b;
} busErr;
int main()
{
busErr err;
char * cPtr;
int *iPtr;
cPtr = (char *)&err;
cPtr++;
iPtr = (int *)cPtr;
*iPtr = 10;
}
Как упомянул другие, это очень конкретно платформа. На системе ARM я работаю (у которой нет виртуальной памяти), есть большие части адресной площади, которые не имеют памяти или периферийных устройств. Если я прочитаю или напишу один из этих адресов, я получаю ошибку шины.
Вы также можете получить ошибку шины, если на самом деле есть аппаратная проблема в автобусе.
Если вы работаете на платформе с виртуальной памятью, вы можете не сможете намеренно генерировать ошибку шины с вашей программой, если это драйвер устройства или другое программное обеспечение для режима ядра. Недопустимый доступ к памяти, вероятно, будет в ловушке как нарушение доступа или аналогично менеджеру памяти (и даже не имеет возможности ударить на автобус).
Также имеем в виду, что некоторые операционные системы сообщают о «ошибке шины» для ошибок, кроме недоступных. Вы не упомянули в своем вопросе, что вы на самом деле пытались достичь. Может быть, попробуйте таким образом:
int *x = 0;
*x=1;
страница Википедии, которую вы связали, чтобы упоминать, что доступ к несуществующей памяти также может привести к ошибке шины. Возможно, вам может возникнуть удача при загрузке известного неверного адреса в указатель и десервес, что.
Единственный способ обойти эту проблему (и это кажется взломом в любом случае) - это либо сделать то, что вы не хотите делать, и сделать свойства конкретного класса виртуальными (даже для реализации интерфейса), либо также явно реализовать интерфейс в вашем классе. Например:
public DateTime EntryTime
{
get { return ((ITransaction)this).EntryTime; }
}
DateTime ITransaction.EntryTime
{
get { throw new NotImplementedException(); }
}
Затем при создании Макета можно использовать синтаксис As < ITransaction > ()
, и макет будет вести себя так, как вы ожидаете.
Объект DisplayMetrics
можно использовать для преобразования пикселов и масштабированных пикселов с атрибутом scaledDensity
.
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity;
-121--620864- Попробуйте что-то примерно так:
#include <signal.h>
int main(void)
{
raise(SIGBUS);
return 0;
}
(Я знаю, вероятно, не тот ответ, который вы хотите, но это почти наверняка даст вам «ошибку шины»!)
Это должно привести к надежной работе SIGBUS
на POSIX-совместимой системе.
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
int main() {
FILE *f = tmpfile();
int *m = mmap(0, 4, PROT_WRITE, MAP_PRIVATE, fileno(f), 0);
*m = 0;
return 0;
}
Из Единой спецификации Unix, mmap:
Ссылки в диапазоне адресов, начиная с pa и продолжая для len байтами на целые страницы после окончания объекта, должны приводить к подаче сигнала SIGBUS.
Ошибки шины возникают при попытке получить доступ к памяти, не адресуемой компьютером. Например, память компьютера имеет диапазон адресов от 0x00 до 0xFF, но вы пытаетесь получить доступ к элементу памяти с адресом 0x0100 или выше.
В действительности, ваш компьютер будет иметь гораздо больший диапазон адресов, чем 0x00 - 0xFF.
Чтобы ответить на вашу первоначальную заметку:
Расскажите мне о ситуации, которая наверняка приведет к ошибке на шине.
В вашем коде, индексируйте в память способом, выходящим за рамки максимального предела памяти. Я не знаю ... использую какое-то гигантское шестнадцатеричное значение 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, индексируемое в числовое* ...
на linux с процессором Intel попробуйте следующее:
int main(int argc, char **argv)
{
# if defined i386
/* enable alignment check (AC) */
asm("pushf; "
"orl $(1<<18), (%esp); "
"popf;");
# endif
char d[] = "12345678"; /* yep! - causes SIGBUS even on Linux-i386 */
return 0;
}
хитрость заключается в установке бита "alignment check" в одном из "специальных" регистров процессора.
см. также: здесь