Códigos de baixa qualidade levam a comportamentos imprevisíveis. Da perspectiva do usuário, isso normalmente se manifesta como usabilidade ruim. Para um invasor, trata-se de uma oportunidade para atacar o sistema de formas imprevistas.
1
sempre deve ser transmitido ao primeiro parâmetro (o número de versão) da seguinte função do sistema de arquivos:
__xmknod
2
sempre deve ser transmitido ao terceiro parâmetro (o argumento de grupo) das seguintes funções de cadeia de caracteres largos:
__wcstod_internal
__wcstof_internal
_wcstol_internal
__wcstold_internal
__wcstoul_internal
3
sempre deve ser transmitido como o primeiro parâmetro (o número de versão) das seguintes funções do sistema de arquivos:
__xstat
__lxstat
__fxstat
__xstat64
__lxstat64
__fxstat64
std::auto_ptr<foo> p(new foo);
foo* rawFoo = p.get();
delete rawFoo;
delete
, essa classe não saberá mais usar o ponteiro.int a = (Int32)i + (Int32)j;
a seguir lança uma exceção sem tratamento e trava o aplicativo em tempo de execução.
class Program
{
static int? i = j;
static int? j;
static void Main(string[] args)
{
j = 100;
int a = (Int32)i + (Int32)j;
Console.WriteLine(i);
Console.WriteLine(j);
Console.WriteLine(a);
}
}
aN
e bN
, mas, no caso padrão, o programador definiu acidentalmente o valor de aN
duas vezes.
switch (ctl) {
case -1:
aN = 0; bN = 0;
break;
case 0:
aN = i; bN = -i;
break;
case 1:
aN = i + NEXT_SZ; bN = i - NEXT_SZ;
break;
default:
aN = -1; aN = -1;
break;
}
game
sem inicializá-la.
struct Game {
address player;
}
function play(uint256 number) payable public {
…
Game game;
game.player = msg.sender;
…
}
Finalize()
para StreamReader
chama Close()
eventualmente, mas não há nenhuma garantia de quanto tempo será necessário antes que o método Finalize()
seja invocado. Na verdade, não há nenhuma garantia de que Finalize()
nunca será invocado. Em um ambiente muito ativo, isso pode fazer com que a VM use todos os seus identificadores de arquivo disponíveis.Exemplo 2: Em condições normais, o código a seguir executa uma consulta de banco de dados, processa os resultados retornados pelo banco de dados e fecha o objeto
private void processFile(string fName) {
StreamWriter sw = new StreamWriter(fName);
string line;
while ((line = sr.ReadLine()) != null)
processLine(line);
}
SqlConnection
alocado. Porém, se ocorrer uma exceção durante a execução do SQL ou o processamento dos resultados, o objeto SqlConnection
não será fechado. Se isso acontecer com frequência suficiente, o banco de dados ficará sem cursores disponíveis e não poderá executar mais consultas SQL.
...
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(queryString);
cmd.Connection = conn;
conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
HarvestResults(rdr);
conn.Connection.Close();
...
int decodeFile(char* fName)
{
char buf[BUF_SZ];
FILE* f = fopen(fName, "r");
if (!f) {
printf("cannot open %s\n", fName);
return DECODE_FAIL;
} else {
while (fgets(buf, BUF_SZ, f)) {
if (!checkChecksum(buf)) {
return DECODE_FAIL;
} else {
decodeBlock(buf);
}
}
}
fclose(f);
return DECODE_SUCCESS;
}
CALL "CBL_CREATE_FILE"
USING filename
access-mode
deny-mode
device
file-handle
END-CALL
IF return-code NOT = 0
DISPLAY "Error!"
GOBACK
ELSE
PERFORM write-data
IF ws-status-code NOT = 0
DISPLAY "Error!"
GOBACK
ELSE
DISPLAY "Success!"
END-IF
END-IF
CALL "CBL_CLOSE_FILE"
USING file-handle
END-CALL
GOBACK
.
BEGIN
...
F1 := UTL_FILE.FOPEN('user_dir','u12345.tmp','R',256);
UTL_FILE.GET_LINE(F1,V1,32767);
...
END;
Camera
em seus manipuladores de eventos onPause()
, onStop()
ou onDestroy()
.Camera
que não é liberada em um retorno de chamada onPause()
, onStop()
ou onDestroy()
. O sistema operacional Android invoca esses retornos de chamada sempre que precisa enviar a atividade atual para segundo plano ou quando precisa destruir a atividade temporariamente nos casos em que o sistema está com poucos recursos. Ao não liberar o objeto Camera
corretamente, a atividade impede que outros aplicativos (ou até mesmo instâncias futuras do mesmo aplicativo) acessem a câmara. Além disso, manter a posse da instância de Camera
enquanto a atividade está pausada pode afetar negativamente a experiência do usuário por meio do esgotamento desnecessário da bateria.onPause()
base, que deve ser usado para liberar o objeto Camera
, nem o libera corretamente durante sua sequência de desligamento.
public class UnreleasedCameraActivity extends Activity {
private Camera cam;
@Override
public void onCreate(Bundle state) {
...
}
@Override
public void onRestart() {
...
}
@Override
public void onStop() {
cam.stopPreview();
}
}
MediaRecorder
, MediaPlayer
ou AudioRecord
em seus manipuladores de eventos onPause()
, onStop()
ou onDestroy()
.onPause()
, onStop()
ou onDestroy()
. O sistema operacional Android invoca esses retornos de chamada sempre que precisa enviar a atividade atual para segundo plano ou quando precisa destruir a atividade temporariamente nos casos em que o sistema está com poucos recursos. Ao não liberar o objeto de mídia corretamente, a atividade faz com que acessos subsequentes ao hardware de mídia do Android (por outros aplicativos ou até mesmo pelo mesmo aplicativo) retrocedam para as implementações de software ou até mesmo falhem completamente. Deixar abertas muitas instâncias de mídia não liberadas pode fazer com que o Android lance exceções, causando efetivamente uma negação de serviço. Além disso, manter a posse da instância de mídia enquanto a atividade está pausada pode afetar negativamente a experiência do usuário por meio do esgotamento desnecessário da bateria.onPause()
base, que deve ser usado para liberar o objeto de mídia, nem o libera corretamente durante sua sequência de desligamento.
public class UnreleasedMediaActivity extends Activity {
private MediaPlayer mp;
@Override
public void onCreate(Bundle state) {
...
}
@Override
public void onRestart() {
...
}
@Override
public void onStop() {
mp.stop();
}
}
onPause()
, onStop()
ou onDestroy()
.onPause()
, onStop()
ou onDestroy()
. O sistema operacional Android invoca esses retornos de chamada sempre que precisa enviar a atividade atual para segundo plano ou quando precisa destruir a atividade temporariamente nos casos em que o sistema está com poucos recursos. Ao não fechar o banco de dados corretamente, a atividade poderá esgotar cursores disponíveis do dispositivo se for reiniciada constantemente. Além disso, dependendo da implementação, o sistema operacional Android também pode lançar DatabaseObjectNotClosedException
, que travará o aplicativo se a exceção não for detectada.onPause()
base, que deve ser usado para liberar o objeto de banco de dados, nem o libera corretamente durante sua sequência de desligamento.
public class MyDBHelper extends SQLiteOpenHelper {
...
}
public class UnreleasedDBActivity extends Activity {
private myDBHelper dbHelper;
private SQLiteDatabase db;
@Override
public void onCreate(Bundle state) {
...
db = dbHelper.getWritableDatabase();
...
}
@Override
public void onRestart() {
...
}
@Override
public void onStop() {
db.insert(cached_data); // flush cached data
}
}