Příspěvek na blogu Ubuntu upozorňuje na několik zranitelností v rozšíření Linuxu o mandatorní řízení přístupu AppArmor. Společně jsou označovány jako CrackArmor. Objevila je společnost Qualys (technické detaily). Neprivilegovaný lokální uživatel se může stát rootem. Chyba existuje od roku 2017. Doporučuje se okamžitá aktualizace. Problém se týká Ubuntu, Debianu nebo SUSE. Red Hat nebo Fedora používají SELinux.
Byla vydána nová verze 19 integrovaného vývojového prostředí (IDE) Qt Creator. Podrobný přehled novinek v changelogu.
Bitwig Studio (Wikipedie) bylo vydáno ve verzi 6. Jedná se o proprietární multiplatformní (macOS, Windows, Linux) digitální pracovní stanici pro práci s audiem (DAW).
Společnost Igalia představila novou linuxovou distribuci (framework) s názvem Moonforge. Jedná se o distribuci určenou pro vestavěné systémy. Vychází z projektů Yocto a OpenEmbedded.
Google Chrome 146 byl prohlášen za stabilní. Nejnovější stabilní verze 146.0.7680.71 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 29 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
D7VK byl vydán ve verzi 1.5. Jedná se o fork DXVK implementující překlad volání Direct3D 3 (novinka), 5, 6 a 7 na Vulkan. DXVK zvládá Direct3D 8, 9, 10 a 11.
Bylo vydáno Eclipse IDE 2026-03 aneb Eclipse 4.39. Představení novinek tohoto integrovaného vývojového prostředí také na YouTube.
Ze systému Slavia pojišťovny uniklo přibližně 150 gigabajtů citlivých dat. Jedná se například o pojistné dokumenty, lékařské záznamy nebo přímou komunikaci s klienty. Za únik může chyba dodavatelské společnosti.
Sněmovna propustila do dalšího kola projednávání vládní návrh zákona o digitální ekonomice, který má přinést bezpečnější on-line prostředí. Reaguje na evropské nařízení DSA o digitálních službách a upravuje třeba pravidla pro on-line tržiště nebo sociální sítě a má i víc chránit děti.
Meta převezme sociální síť pro umělou inteligenci (AI) Moltbook. Tvůrci Moltbooku – Matt Schlicht a Ben Parr – se díky dohodě stanou součástí Meta Superintelligence Labs (MSL). Meta MSL založila s cílem sjednotit své aktivity na poli AI a vyvinout takovou umělou inteligenci, která překoná lidské schopnosti v mnoha oblastech. Fungovat by měla ne jako centralizovaný nástroj, ale jako osobní asistent pro každého uživatele.
Dobrý den, konečně jsem si udělal čas a začal se učit céčko, mám problém, pokoušel jsem se o prográmek, ktrerý naplní pole hodnotami indexů, vytiske, pak vynuluje a znova vytiskne, bohužel, nevím, kde je problém, ale nenuluje ho správně:
#include <stdio.h>
int main() {
int pole[10], i,a;
for (i=0;i<10;i++) {
pole[i]=i;
}
int *ppole;
ppole = &pole;
for (a=0;a<10;a++) {
printf("%d:\t%d\n", a, *(ppole + a));
}
while(ppole <= &pole[9]) {
*(ppole++)=0;
}
for (a=0;a<10;a++) {
printf("%d:\t%d\n", a, *(ppole++));
}
return 0;
}
výstup je pak zhruba následující:
david@PC1 /home/david/texty/programovani/cecko $ ./36-ukazatel_s_polem 0: 0 1: 1 2: 2 3: 3 4: 4 5: 5 6: 6 7: 7 8: 8 9: 9 0: 10 1: 1 2: -1074194984 3: -1074194944 4: 0 5: 1105578095 6: 1091910816 7: 134513744 8: 0 9: 1105578095
jako by to nějak přetěkalo, nebo co, použiji-li for cyklus, jede to, takhle ne, chybu tam prostě nevidím, netušíte někdo? Předem díky moc...
PS: takhle to mám, abych si procvičil ukazatele s poly
ppole jste nenastavil znovu na začátek pole.
-lefence
V tomto případě sice nepomůže (protože se jedná o zásobník), ale jinak je to naprosto nutná věc.
#include stdio.h
int main() {
int pole[10], i,a;
for (i=0;i<10;i++) {
pole[i]=i;
}
int *ppole;
ppole = &pole;
for (a=0;a<10;a++) {
printf("%d:\t%d\n", a, *(ppole + a));
}
while(ppole <= &pole[9]) {
*(ppole++)=0; // tu sa posuva adresa o prvok dalej
}
// teda ukazovatel na konci cyklu while ukazuje na koniec pola
ppole = &pole;
for (a=0;a<10;a++) {
printf("%d:\t%d\n", a, *(ppole++));
}
return 0;
}
#include <string.h>
void foo()
{
int pole[DELKA_POLE];
...
memset(pole, 0, sizeof(pole));
...
}
void foo()
{
int pole[DELKA_POLE] = {0};
...
}
int pole[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
což by u velkých polí byla docela otrava
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N (10)
int tisknipole(int *pole){
int i;
for (i = 0; i < N; i++){
printf("%10d. %10d\n", i, pole[i]);
}
return 0;
}
int main(int argc, char** argv){
int pole[N] = {1};
tisknipole(pole);
return 0;
}
což nainicializovalo pouze nultý prvek. Zřejmě to chápu nějak špatně.
struct S {
int i;
double d;
char c[100];
};
void foo() {
struct S s1 = {0};
struct S s2 = {1};
struct S s3 = {1, 1.0};
struct S s4[100] = {0};
}
int pole[10] = {1, 2, 3}
ppole = &pole;
for (a=0;a<10;a++) {
printf("%d:\t%d\n", a, *(ppole + a));
}
Překvapuje mě, že tahle část dělá to, co se od ní očekává. Jeden by si myslel, že se do ppole uloží ukazatel na ukazatel na pole, zvlášt když gcc nadává, že
sileny_pointry.c:11: warning: assignment from incompatible pointer type
int pole[10];
...
int *ppole;
ppole = &pole;
Vyznačený riadok je zle. Má byť
ppole=pole;
pole je výraz typu int*, ale &pole je int**.
&pole je typu int(*)[10].
int pole[10];není totéž co
int *pole; pole = (int *) malloc(10 * sizeof(*pole));
pole ukazuje na prvni prvek pole a &pole ukazuje na zacatek pole. prvni prvek pole je ovsem jeho zacatkem, takze pole == &pole plati.
.-------. .------.
| &pole | ---> | pole | ----------.
`-------' `------' |
v
.---.---.---.- -
| | | |
`---'---'---'- -
pole == &pole platí jen a pouze tehdy, pokud pole ukazuje samo na sebe, což by vypadalo takto:
.-------. .------.
| &pole | ---> | pole | -----.
`-------' `------' |
^ |
| |
`-------------------------'
&pole je adresa pointeru na prvni prvek poleNe, žádný takový pointer v diskutované situaci neexistuje.
pole) je non-l-value.
Každopádně bych zápis &pole raději ani nepovoloval, protože je matoucí.
int neni_zle() {
int pole[10];
return &pole == &pole[0];
}
test.cpp:6: error: comparison between distinct pointer types ‘int (*)[10]’ and ‘int*’ lacks a castPorovnat můžete
pole a &pole[0], výsledkem bude true.
int neni_zle() {
int pole[10];
return reinterpret_cast< void *>(&pole) == reinterpret_cast< void *>(&pole[0]);
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N (100)
int tisknipole(int *pole){
int i;
for (i = 0; i < N; i++){
printf("%10d. %10d\n", i, pole[i]);
}
return 0;
}
int main(int argc, char** argv){
int *pole;
int i;
pole = (int *) malloc(N * sizeof(*pole));
if (!pole){
printf("Out of memory\n");
return -1;
}
for (i = 0; i < N; i++) pole[i] = i;
tisknipole(pole);
memset(pole, 0, N*sizeof(*pole));
tisknipole(pole);
free(pole);
return 0;
}
int pole[10000000];Dostanete segmentation fault a dost špatně se to debugguje. Navíc pole o pevné velikosti většinou plýtvá pamětí (protože se tam nacpe raději víc než míň), při požadavku na změnu velikost pole se musí překompilovávat, do toho pointeru se nedá zapsat třeba NULL (což se občas může hodit).
Tiskni
Sdílej: